WEB服务器工作原理
TCP/IP网络模型
TCP/IP 网络模型共包括:应用层、传输层、网络层、数据链路层、物理层
应用层
应用层的作用:为应用软件提供接口,使应用程序能够使用网络服务
常见应用层协议:http(80)、https(443)、ftp(20/21)、smtp(25)、pop3(110)、telnet(23)、ssh(22)、dns(53)等
传输层
传输层的作用:
- 负责分段上层数据,建立端到端的连接,保证报文在端到端之间的传输
- 区分不同的流量:使用端口号十进制数值,一个的端口号代表一种流量(HTTP—80、HTTPS—443、Telnet—23、SSH—22等)
传输层协议:
网络层协议:IP、 ICMP、ARP、RARP等
网络层设备:路由器
数据链路层
数据链路层的作用:
- 将数据封装成数据帧,并提供可靠的数据传输服务,把帧从一跳(结点)移动到另一跳(结点)
- 物理编址(mac地址)
数据链路层协议:Ethernet、 Token Ring、FDDI等
数据链路层设备:交换机
物理层
物理层的作用:将数据封装成比特,负责把逐个的比特从一跳(结点)移动到另一跳(结点)
物理层设备:中继器(还原信号,延长传输距离,但不能无限延长,错误率会提高),集线器(扩口器、类似于插线板)
TCP 协议
TCP 协议包含6个标志位、2种号码:
6个标志位:
- SYN(synchronous 建立联机)
- ACK(ackonwledgement 确认)
- PSH(push 传送)
- FIN(finsh 结束)
- RST(reset 重置)
- URG(urgent 紧急)
2种号码:
- Sequence number (顺序号码)
-
TCP 三次握手

第一次握手(连接请求):连接建立方(Client)发送SYN包,并包含了自己的初始序号a
- 第二次握手(请求确认):连接接受方(Server)收到SYN包以后会回复一个SYN包,其中包含了对上一个a包的回应信息ACK,回应的序号为下一个希望收到包的序号,即a+1,然后还包含了自己的初始序号b
第三次握手(连接确认):连接建立方(Client)收到回应的SYN包以后,回复一个ACK包做响应,其中包含了下一个希望收到包的序号即b+1
TCP 四次挥手

第一次挥手(关闭请求):主动关闭方(client)发送FIN包,并包含自己的初始序号a
- 第二次挥手(请求确认):当服务器收到这个FIN包,它发回一个ACK包,确认序号为收到的序号加1
- 第三次挥手(关闭连接): 同时TCP服务器还向应用程序传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的TCP端发送一个FIN包
第四次挥手(关闭确认):主动关闭方(client)发回一个确认,并将确认序号设置为收到序号加1
案例:访问新浪网来分析网络请求过程
一、Wireshark配置过滤来捕获sina
新浪地址:http://www.sina.com/
二、解析73号DNS数据包

Frame 73: 80 bytes on wire (640 bits), 80 bytes captured (640 bits) on interface 0
这是物理层,Frame 73代表这是第73号数据包,大小为80
- Ethernet II, Src: IntelCor_37:44:c0 (34:de:1a:37:44:c0), Dst: HuaweiTe_71:8a:98 (00:46:4b:71:8a:98)
数据链路层的报文头及相关协议( 还有PPP 和PPPOE协议),Src表示源mac地址,前缀IntelCor 表示是windows系统(若是mac,则是Apple开头的);而Dst表示网络路由地址
- Internet Protocol Version 4, Src: 27.18.155.45, Dst: 202.103.24.68
这是网络层。表示使用了IPV4协议,Src是源IP地址,Dst是DNS服务器地址
- User Datagram Protocol, Src Port: 60889, Dst Port: 53
传输层中UDP协议的头。 这个DNS的请求是作为一个UDP包发送,不需要预先建立连接
- Domain Name System (query)
这是应用层,DNS的qurey内容
UDP包中的传输内容就是DNS的query部分,由以上二进制数据表示。wireshark会根据协议定义翻译出每个字节的含义:
- Ethernet II, Src: HuaweiTe_71:8a:98 (00:46:4b:71:8a:98), Dst: IntelCor_37:44:c0 (34:de:1a:37:44:c0)
数据链路层的报文头及相关协议( 还有PPP 和PPPOE协议),Src为网络路由地址
- Internet Protocol Version 4, Src: 202.103.24.68, Dst: 27.18.155.45
网络层。Src是DNS服务器地址,Dst是客户端IP,代表DNS将包发送到客户端
- Domain Name System (response)
应用层。查看下图DNS的response内容,Queries是本机请求新浪IP,而Answers有3个地址
对比查看,发现 DNS 的 response 中的 Answers提供的 IP 地址(66.102.251.33)与75号 TCP 数据包 IP 相对应,说明我们可以从 Answer 第三个信息连上,获取到新浪网的 IP 地址后,需要开始建立连接
四、与新浪网连接,进行3次握手(75、76、77号TCP包)
经过以上分析后,接下来在 wireshark 中搜索只有相关 IP 地址的信息(搜索 ip.addr==66.102.251.33)。如下图,这样即可查看客户端 PC 与新浪网的交互过程:
第一个包标志为 [SYN],第二个包标志为 [SYN,ACK],第三个包标志为 [ACK]
解析75号TCP包(第一次握手):
- 数据链路层(Ethernet II):包从客户端PC发送到路由。
- 网络层(IPV4):将包发给新浪网地址。
- 传输层(TCP)
解析76号TCP包(第二次握手):
- 数据链路层(Ethernet II):包从路由发送到客户端PC。
- 网络层(IPV4):将包发给客户端PC
- 传输层(TCP)
解析77号TCP包(第三次握手):
- 数据链路层(Ethernet II):包从客户端PC发送到路由。
- 网络层(IPV4):将包发给新浪网地址。
- 传输层(TCP)
五、成功建立连接,客户端GET请求资源(78号HTTP包)
六、服务端确认ACK
七、服务端返回数据

接下来查看80、81、82号TCP三个包,是新浪网返回的数据,通过上图可知每个包大小都是1502,表示一个包发不完,所以分成几个包来发送。
根据下图这三个包中的 Sequence number 变化可知,3个包传递的 TCP 内容长度皆为1440,顺序号从1开始,逐渐变化增加:1 ->1441 -> 2881
八、客户端接收ACK

83包中的 Acknowledgment number 为2881,注意对应上一点讲解的80、81、82号TCP包中的 Next Sequence number 字段可知:81个包中 Next Sequence number 长度为2881,意味着已有0~2880长度数据,所以83包的Ack 代表同时确认了新浪网发送的80、81这两个包。
92包中的 Acknowledgment number 为4321,对应着82号TCP包中的 Next Sequence number 字段。代表92包的Ack确认了新浪网发送的82包。
有时候是同时 Ack 两个包,有时候是Ack一个包。
九、服务端返回HTTP响应
十、客户端确认ACK

189号 TCP 包再次对传输的数据进行了确认Ack。重点查看TCP内容中的 Acknowledgment number 为 8341 ,表示已经收到8340字节,下一个数据从8341开始,正好对应了96号 HTTP 包中的长度树也是8340,新浪网首页请求过程成功探索完毕
案例总结
数据传输过程
请求流程
- 客户端 PC 发起网络请求,访问新浪网
- DNS 服务器解析域名对应 IP 地址
- 为了与新浪网建立连接,进行网络协议中的3次握手
- 成功建立连接,开始 GET 请求资源
- 客户端 PC 与新浪网交互(数据包发送与确认 ACK)
- HTTP 中 get 请求200,成功访问新浪网






