TCP/IP详解---tcp报头&协议详解

TCP协议是传输层上重要的一个协议,所以下面我就对TCP协议总结一下。

一、TCP服务特点

(1)面向连接的。面向连接就是通讯双方必须先建立连接,才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。

(2)可靠的。可靠性体现在TCP协议提供了超时重传机制和发送应答机制。

(3)流式服务。当接收端收到一个或多个TCP报文段后,TCP模板将它们携带的应用程序数据按照TCP报文段的序号依次放入TCP接收缓冲区中,并通知应用程序读取数据。应用程序的读取操作数量和接收数据操作数量没有固定的数量关系。(后面会说的UDP的数据报服务,一次读操作就有一次接收操作,一对一)

二、TCP头部结构


 

 

 16位源端口号和16位目的端口号:告知主机该报文段来自哪里(源端口)以及传给哪个上层协议或者应用程序(目的端口)。

 

32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每一个字节编号。因为有32位序号的存在,保证了收到的数据不会乱序。(可靠保障)

 

32位确认号:用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。(可靠保障)

 

4位头部长度:标识改TCP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以TCP头部最长是60字节。

 

6位标志位包含以下几项:

  URG标志:表示紧急指针是否有效。

  ACK标志:表示确认号是否有效。称ACK标志的TCP报文段为确认报文段。

  PSH标志:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为后续数据腾出空间。

  RST标志:表示要求对方重新建立连接

  SYN标志:表示请求建立一个连接。

  FIN标志:表示通知对方本端要关闭连接了。

 

16位窗口大小:是TCP流量控制的一个手段。告诉对方本段TCP接收缓冲区还能容纳多少字节的数据,对方就可以控制发送数据的速度。

 

16位校验和:由发送端填充,接收端对TCP报文执行CRC算法检验TCP报文段在传输过程中是否损坏。(可靠保障)

 

16位紧急指针:一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。

  

TCP头部选项:是一个可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中20字节为固定部分)。

三、TCP连接的建立和关闭

 
 

连接建立:三次握手

理解:因为TCP协议是面向连接的,所以两个应用程序通信之前要先建立连接。三次握手就是一个建立连接的过程。

过程比喻:

 A:我现在想和你通信了,你能收到我发的这条消息吗?(SYN)

 B:我确认收到你的消息了(ACK),那你现在能收到我的这条消息吗?(SYN)

 A:我确认收到你的这条消息了(ACK)

到了这一步则三次握手已经完成,表示两个应用程序已建立连接。这里应该指如果我能收到你的上条消息则就能收到你发给我的消息,所以经过三次通信后就能建立连接。(之前想过如果我后面发的消息你没收到怎么办,那就需要每次一个人发一个消息,另一个人说我收到了消息,你收到我现在发的消息没,其实这是一个无限循环的过程,而且什么事也没有干。)

注:建立连接至少是3次握手,不能少。(因为是全双工通信,如果两次握手就认为连接建立了,那么主动连接端发送连接请求后就意外崩掉了,而接收端收到连接请求回复确认后,就以为连接好了,当给对方发送数据时,就会出现错误)

断开连接:四次挥手

 
 

 

 

过程比喻:4次挥手

 A端:我现在想断开连接了(FIN)(既然想断开连接了,那肯定已经建立了连接)

 B端:我确认收到你的消息了(ACK)(但是现在我还有一些数据要处理,还不能马上断开连接)

 B端:好了,我现在处理好了,可以断开连接了(FIN)

 A端:我确认收到你的断开请求了(ACK)

 

这里提出一个概念:半关闭状态

简单来说就是通信的一端发送结束报文段(FIN)给对方,告诉它本端已经完成了数据的发送,但允许继续接收来自对方的数据,直到对方也发送了结束报文段以关闭连接。如上说就是A端发起的FIN时到B端发起FIN直间这个状态,期间A端可以继续接收来自B端的数据。

 

注:

4次挥手也可以是3次挥手(B端接收到断开请求时不用处理数据,直接也可以发出断开请求)

A端:我现在想断开连接了(FIN)(既然想断开连接了,那肯定已经建立了连接)

  B端:我确认收到你的消息了(ACK) 我可以断开连接了(FIN)

  A端:我确认收到你的断开请求了(ACK)

 

下面我们来详细看一下从连接到断开的状态转化图

 
 

这里需要注意的是:

(1)断开连接是服务器端和客户端都可以主动提出断开请求,谁主动提出断开连接的,那么TIME_WAIT状态就在那一边。(即主动发起断开链接请求的一端)

TIME_WAIT意义:

1、保证可靠的终止 TCP 连接

2、保证迟来的数据报能被识别并丢弃

 注:TIME_WAIT的时间是2MSL,就是确保以上两条都能满足和处理。但是大量的TIME_WAIT状态又会带来很多问题。详情可以参考之前的一片博客:https://blog.csdn.net/ShWe_yayaya/article/details/81540950

 
 

由这幅图可以明确看出三次握手建立连接,四次挥手断开连接的过程,可以看出确认报文段(ACK)的值是收到的TCP报文段的序号值加1。

 

附上一张TCP状态转移图

 
 

 

猜你喜欢

转载自blog.csdn.net/ShWe_yayaya/article/details/81637685