TCP分析01

1.以浏览器输入地址信息为例,浏览器调用协议栈会经过如下几个步骤:

 step 1 发送UDP协议的查询信息到DNS服务器,执行域名解析操作

 step 2 创建对应的套接字(socket),存储对应的控制信息

 step 3 连接操作(三次握手),交换通信双方的控制信息

 step 4 发送消息,write

 step 5 接收消息,  read

 step 6 断开连接,(四次挥手)

2.控制信息

  通信操作中使用的控制信息分为两类。
(1) 头部中记录的信息
(2) 套接字(协议栈中的内存空间)中记录的信息 (如通信对象的 IP 地址、端口号、通信操作的进行状态)

  TCP 头部 (>=20字节)

   

      

 3.TCP分析

 1.连接操作分析(三次握手)

  source:发送方,Destination:接收方,Protocol:协议类型,Length:包总大小,Info:控制信息

step 1. 从客户端(192.168.0.103)发送连接请求到服务器(139.129.231.219);

           1)其中客户端端口号为52275,远程端口号为80 (52275-80);

           2)控制位为[SYN],表示请求建立连接

      3 ) Seq=0客户端相对序列号,Win=8192客户端窗口大小,Len=0发送的数据长度,MSS=1460客户端最大分段大小(MTU(最大传输单元)-IP头部-TCP头部=MSS)

step 2.服务器收到客户端的连接请求后,发送连接请求到客户端 (139.129.231.219---->192.168.0.103)

      1)其中客户端端口号为52275,远程端口号为80 (80-52275);

           2)控制位为[SYN,ACK],SYN表示请求建立连接,ACK表示收到客户端请求

           3)Seq=0服务器相对序列号,Ack(ACKNUM)=1服务器告知客户端下次的序列号应从1发起,表示之前的包服务器都已收到,客户端若长时间没有收到服务器的返回的ACK,会重新发送包,WIN=14600服务端窗口大小,LEN=0发送的数据长度,MSS=1440服务端最大分段大小(MTU(最大传输单元)-IP头部-TCP头部=MSS)

step 3.客户端收到服务器的连接请求后,客户单发送ACK消息到服务器(192.168.0.103---->139.129.231.219)

     1)  其中客户端端口号为52275,远程端口号为80 (52275-80);

          2 )    控制位为[ACK],ACK表示收到服务器请求

          3)  Seq=1客户端相对序列号,Ack(ACKNUM) = 1 客户端告知服务器下次的序列号应从1发起,表示之前的包客户端都已收到,服务器若长时间没有收到的客户端返回的ACK,会重新发送包,WIN=66240客户端窗口大小,LEN=0发送的数据长度

2.收发操作

 1)客户端请求http://xxx

 2 ) 服务器计算返回数据的大小,并根据MSS将包分成了2个,服务器发送包至客户端的时候并没有等待上一个包返回ACK通知再发送第二个包,此时使用了滑动窗口方式

同时根据接收方的缓冲区,来控制发送

 3)客户端收到服务器发送的多个包后,会将ACK和窗口通知合并,减少发送频率,提高网络效率,返回最终的ACKNUM给服务器

 4)http协议中每种资源客户端都会发送一次请求去获取

 5)ACKNUM的计算

 ACKNUM=SEQ+LEN(收到的数据长度)

3.断开操作(四次挥手)

 step 1.协议允许任何一端发起断开操作

step 2.这里是服务端发起断开操作(139.129.231.219),控制位为[FIN,ACK],FIN表示断开操作

step 3.客户端收到服务端的断开操作后,发送控制位为[ACK]到服务端,告知服务端已收到FIN为1的包

step 4.客户端发起断开操作(192.168.0.103),控制位为[FIN,ACK],FIN表示断开操作

step 5.服务端收到客户端的断开操作后,发送控制位为[ACK]到客户端,告知客户端已收到FIN为1的包

step 6.套接字不会立即被删除,而是会等待一段时间后再被删除。

假设断开操作和上述操作相反,由客户端先发起

举例说明:

1)客户端发送FIN

2)服务器返回ACK号

3)服务器发送FIN

4)客户端返回ACK号

如果最后客户端返回的ACK号丢失了,这时由于服务端没有收到ACK号,可能会重发一次FIN。

如果客户端套接字已经删除了,那么套接字中保存的控制信息也就跟着消失了,套接字对应的

端口号就被释放出来了。这时,如果别的应用程序要创建套接字,新套接字碰巧被分配了同一个端口号,

而服务器的FIN正好到达,那么就会产生错误。

猜你喜欢

转载自www.cnblogs.com/scott-yu/p/11464842.html