配置网络

两个都在同一网段下,就不设置默认网关了

client(客户端)

servers(服务端)

启动服务器的httpserver,随便选个文件夹

测试ping

模拟客户端访问HTTP服务器过程

客户端上在输入服务器的地址:http://192.168.1.2:80。模拟客户端访问网站的过程。

在交换机结点上启动wireshark,然后点击上面的获取按钮进行抓包分析

三次握手

第一次握手

通常也称为客户端发送一个标识了SYN=1的数据段,表示期望与服务器A建立连接,TCP规定SYN=1时不能携带数据虚拟序号,并没有数据),但要消耗一个序号,因此声明自己的序号是 seq=0(书上说是随机=x),此时TCP客户端进入SYN-SENT(同步已发送)状态

第二次握手

服务端回复标识了SYN=1,ACK=1的数据段,此数据段的序列号seq=0,确认序列号为主机A的序列号加1(ack=1),以此作为对主机A的SYN报文的确认。

该数据也不能携带数据,和上面一样,仍需要一个虚拟序号来设置seq标识

第三次握手

客户端发送一个标识了ACK=1的数据段,此数据段的序列号seq=x+1=1,确认序列号为服务器A的序列号加1(ack=y+1=1),以此作为对服务器A的SYN报文段的确认。

四次挥手

第一次挥手

客户端想终止连接,于是发送一个标识了FIN=1,序列号为seq=158,FIN=1的作用就是用来释放连接的,表明服务端的数据我已经接收完毕,要求释放连接。

此时TCP连接处于半关闭状态,即客户端已经没有数据要发送了,但服务端若发送数据,客户端仍要接收

第二次挥手

服务端回应一个标识了ACK=1的数据段,序列号为seq=v=308,确认序号为ack=u+1=159,作为对客户端的FIN报文的确认。

此时客户端进入FIN-WAIT-2状态,等待服务端发送连接释放请求

第三次挥手

服务端想终止连接,于是向客户端发送一个标识了FIN=1,ACK=1的数据段,序列号为seq=w=v=308,确认序列号为ack=u+1=159(和第二次挥手没变)。表明服务端数据已经发送完毕,要求释放连接。

解决一个疑问:书上在这里的seq=w,而没有直接写seq=v(上一个seq),考虑到在半关闭状态在,可能服务端又发送了一些数据导致w≠v,但在这里服务端没有发送数据,所以w=v

第四次挥手

客户端正常确认服务端的连接释放报文,seq=u+1=159;ack=w+1=309;ACK=1

客户端最后发的确认报文,必须等待2MSL(2个最长报文寿命),因为如果这个报文发出去后丢失了,服务端会在1MSL后重发,此时客户端在等待中就知道刚才发的报文丢失了,再重发一个就好了。

小结

  • seq = ack(上)
  • ack = seq(上) + 1


所念皆星河