局域网中一次HTTP通信内部过程

1. 本地环境介绍

1.1网络连接信息

  本地使用Vmware搭建了多台虚拟机,对于PC而言,相当于多了一块网卡,这块网卡只能和内部通信(虚拟机)

  每块网卡都有自己的ip地址。

  

1.2 windows下ip地址

C:WINDOWSsystem32>ipconfig /all

Windows IP 配置

主机名 . . . . . . . . . . . . . : gc
主 DNS 后缀 . . . . . . . . . . . :
节点类型 . . . . . . . . . . . . : 混合
IP 路由已启用 . . . . . . . . . . : 否
WINS 代理已启用 . . . . . . . . . : 否

以太网适配器 以太网:

连接特定的 DNS 后缀 . . . . . . . :
物理地址. . . . . . . . . . . . . : 00-E0-70-03-41-F4
DHCP 已启用 . . . . . . . . . . . : 是
自动配置已启用. . . . . . . . . . : 是
IPv4 地址 . . . . . . . . . . . . : 192.168.0.109(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 192.168.0.1
DHCP 服务器 . . . . . . . . . . . : 192.168.0.1
DNS 服务器 . . . . . . . . . . . : 202.101.172.48,202.101.172.47

以太网适配器 VMware Network Adapter VMnet8:

描述. . . . . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet8
物理地址. . . . . . . . . . . . . : 00-50-56-C0-00-08
DHCP 已启用 . . . . . . . . . . . : 是
自动配置已启用. . . . . . . . . . : 是
IPv4 地址 . . . . . . . . . . . . : 192.168.134.1(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . :
DHCP 服务器 . . . . . . . . . . . : 192.168.134.254
主 WINS 服务器 . . . . . . . . . : 192.168.134.2
TCPIP 上的 NetBIOS . . . . . . . : 已启用

 1.3linux下ip地址

  IP地址:192.168.134.128

  mac: 00:0c:29:a1:11:93

  默认网关: 192.168.134.2

  

1.4 WINS服务器和DNS服务器的区别

  WINS服务器使用的是IP地址和计算机名称的映射,DNS实现的是IP地址和域名的映射

  WINS服务器的作用范围是某个内部网络,DNS服务器的作用范围是整个互联网

  如上图,虚拟机linux 192.168.134.128的默认网关为wins虚拟机网卡上配置的WINS服务器ip地址 192.168.134.2.

2. HTTP请求过程

2.1. ARP寻址

  操作:先清除之前学到的arp信息,然后发起http请求(linux上安装了httpd服务器,所以可以直接访问80端口)

  

  

  

  查看本地学到新的arp信息,mac同上(即为linux服务器192.168.134.128的mac地址)。

  抓包分析如下:(看前两行即可)

·    1.pc发送广播请求,请求192.168.134.128的mac地址,报文信息:物理层的mac地址为 ff:ff:ff:ff:ff:ff(表示广播), 网络层的ip地址为192.168.134.128,mac为0(此时不知道目的mac)

     2.192.168.134.128那台linux服务器收到arp请求后判断请求的是自己的arp信息,于是发送单播应答给pc(192.168.134.1). 于是pc学到了mac地址,开始进行tcp请求。

    备注:如果其它的linux开启了arp代答功能,则可能会发送arp应答(如果它直到192.168.134.128这台服务器的mac地址的话)

    

2.2. TCP三次握手

  http请求底层使用的是tcp连接,所以需要先发起tcp请求,下面抓包为tcp三次握手过程

  1.客户端192.168.134.1向服务端192.168.134.128发送SYN请求,序列化Seq为0

  2.服务端向客户端发送SYN请求,ACK为对SYN请求的应答,Seq=0,Ack=1 (Seq为本端发送数据的序列号,根据发送数据长度递增,起始为0,Ack为应答序列号,值为对端Seq+1)

  3.客户端向服务端发送ACK,三次握手成功。

  后面可以基于这条tcp连接发送数据了

  

  理论图片如下:

    

2.3 HTTP通信

  通过google开发者工具(F12)可以看到请求内容和应答内容:

    

  抓包内容如下(对应的data就是上图中的http请求头信息和应答信息):

    

2.4 TCP4次挥手

  http通信之后,过一段时间(连接超时,如上图为httpkeep-alive time为5秒)后tcp连接关闭,需要进行四次挥手。下面是抓包数据:

    1.客户端向服务端发送FIN请求

    2.服务端恢复了ACK,作为对FIN的应答(表示收到关闭连接的请求,应答之后对端处于终止等待状态,可以接受数据不能发送数据)

    3.服务端发送FIN请求,表示服务端也关闭连接(服务端收到对端关闭请求之后可能上层需要做一些处理,在本端也关闭之前,仍然可以向客户端发送数据)

    4.客户端收到服务端关闭连接请求FIN, 发送应答给服务端,四次挥手结束。(实际上这时还有个TIME_WAIT等待状态,linux是等待一分钟,可配置,这时的端口是可复用的)

    备注:上述2,3两步是用一个tcp包传输过来的,因为服务端连接也处于空闲状态,所以收到关闭请求后自己也就随之关闭了。

    

  理论图片如下:

    

原文地址:https://www.cnblogs.com/gc65/p/11371542.html