WEB服务器工作原理

图片1.png

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等)

传输层协议:

  • TCP 属于面向连接的传输控制协议
  • UDP 属于无连接的数据报协议

    网络层

    网络层的作用(寻址和路由选择):

  • 将数据打包成数据包(packet)

  • 为网络设备提供逻辑地址(IP)
  • 进行路由选择、维护路由表

网络层协议:IP、 ICMP、ARP、RARP等
网络层设备:路由器

数据链路层

数据链路层的作用:

  • 将数据封装成数据帧,并提供可靠的数据传输服务,把帧从一跳(结点)移动到另一跳(结点)
  • 物理编址(mac地址)

数据链路层协议:Ethernet、 Token Ring、FDDI等
数据链路层设备:交换机

物理层

物理层的作用:将数据封装成比特,负责把逐个的比特从一跳(结点)移动到另一跳(结点)
物理层设备:中继器(还原信号,延长传输距离,但不能无限延长,错误率会提高),集线器(扩口器、类似于插线板)

TCP 协议

TCP 协议包含6个标志位、2种号码:
6个标志位:

  1. SYN(synchronous 建立联机)
  2. ACK(ackonwledgement 确认)
  3. PSH(push 传送)
  4. FIN(finsh 结束)
  5. RST(reset 重置)
  6. URG(urgent 紧急)

2种号码:

  1. Sequence number (顺序号码)
  2. Acknowledge number (确认号码)

    TCP 三次握手

    图片2.png

  3. 第一次握手(连接请求):连接建立方(Client)发送SYN包,并包含了自己的初始序号a

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

    TCP 四次挥手

    图片3.png

  6. 第一次挥手(关闭请求):主动关闭方(client)发送FIN包,并包含自己的初始序号a

  7. 第二次挥手(请求确认):当服务器收到这个FIN包,它发回一个ACK包,确认序号为收到的序号加1
  8. 第三次挥手(关闭连接): 同时TCP服务器还向应用程序传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的TCP端发送一个FIN包
  9. 第四次挥手(关闭确认):主动关闭方(client)发回一个确认,并将确认序号设置为收到序号加1

    案例:访问新浪网来分析网络请求过程

    一、Wireshark配置过滤来捕获sina

    新浪地址:http://www.sina.com/
    图片4.png

    二、解析73号DNS数据包

    图片5.png

  10. Frame 73: 80 bytes on wire (640 bits), 80 bytes captured (640 bits) on interface 0

这是物理层,Frame 73代表这是第73号数据包,大小为80

  1. 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表示网络路由地址

  1. Internet Protocol Version 4, Src: 27.18.155.45, Dst: 202.103.24.68

这是网络层。表示使用了IPV4协议,Src是源IP地址,Dst是DNS服务器地址

  1. User Datagram Protocol, Src Port: 60889, Dst Port: 53

传输层中UDP协议的头。 这个DNS的请求是作为一个UDP包发送,不需要预先建立连接

  1. Domain Name System (query)

这是应用层,DNS的qurey内容
图片6.png
UDP包中的传输内容就是DNS的query部分,由以上二进制数据表示。wireshark会根据协议定义翻译出每个字节的含义:

  • Response响应在74号包
  • Transaction ID是0xe231
  • Questions数量为1,查询内容是www.sina.com新浪网的地址

    三、解析74号DNS数据包

    图片7.png
  1. 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为网络路由地址

  1. Internet Protocol Version 4, Src: 202.103.24.68, Dst: 27.18.155.45

网络层。Src是DNS服务器地址,Dst是客户端IP,代表DNS将包发送到客户端

  1. Domain Name System (response)

应用层。查看下图DNS的response内容,Queries是本机请求新浪IP,而Answers有3个地址
图片8.png
对比查看,发现 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 与新浪网的交互过程:
图片9.png
第一个包标志为 [SYN],第二个包标志为 [SYN,ACK],第三个包标志为 [ACK]

解析75号TCP包(第一次握手):

  • 数据链路层(Ethernet II):包从客户端PC发送到路由。
  • 网络层(IPV4):将包发给新浪网地址。
  • 传输层(TCP)

图片10.png
图片11.png

解析76号TCP包(第二次握手):

  • 数据链路层(Ethernet II):包从路由发送到客户端PC。
  • 网络层(IPV4):将包发给客户端PC
  • 传输层(TCP)

图片12.png
图片13.png

解析77号TCP包(第三次握手):

  • 数据链路层(Ethernet II):包从客户端PC发送到路由。
  • 网络层(IPV4):将包发给新浪网地址。
  • 传输层(TCP)

图片14.png
图片15.png

五、成功建立连接,客户端GET请求资源(78号HTTP包)

图片16.png
图片17.png

六、服务端确认ACK

图片18.png

七、服务端返回数据

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

八、客户端接收ACK

图片20.png
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响应

图片21.png

十、客户端确认ACK

图片22.png
189号 TCP 包再次对传输的数据进行了确认Ack。重点查看TCP内容中的 Acknowledgment number 为 8341 ,表示已经收到8340字节,下一个数据从8341开始,正好对应了96号 HTTP 包中的长度树也是8340,新浪网首页请求过程成功探索完毕

案例总结

数据传输过程

图片23.jpg
图片24.jpg

请求流程

  1. 客户端 PC 发起网络请求,访问新浪网
  2. DNS 服务器解析域名对应 IP 地址
  3. 为了与新浪网建立连接,进行网络协议中的3次握手
  4. 成功建立连接,开始 GET 请求资源
  5. 客户端 PC 与新浪网交互(数据包发送与确认 ACK)
  6. HTTP 中 get 请求200,成功访问新浪网