详解TCP协议

Posted by DH on July 13, 2017

概述

TCP协议属于面向连接、可靠的协议。他通过校验和、序列号、确认应答。重发控制等实现可靠的传输。

TCP报文头

TCP的报文段首部最长60字节。其中20字节是固定长度的,40字节是可变长度。

以下是TCP首部的格式:

其中从源端口到紧急指针这一部分是不可变部分,长度是20字节,选项和填充是可变部分,长度最长可达40字节。

源端口和目的端口

表示端口号

序号

序号表示数据报报文段的第一个字节的序号。

确认号

确认号表示希望接收到的下一个数据报报文段的第一个字节的序号。

数据偏移

数据偏移表示TCP报文段首部的长度

URG

URG=1 表示紧急指针有效,告诉系统本报文段含有紧急数据,应该尽快发出

ACK

ACK = 1 才表示连接有效

PSH

表示应该尽快发送,不必等缓冲区装满

RST

重置,表示TCP连接出现了严重的错误,需要释放连接,重新进行连接

SYN

建立连接时,需要将其设置为1

FIN

释放链接时使用

窗口

用于控制对方发送数据的数据量

校验和

检验范围包括首部和数据,检测报文在传输中是否出错

紧急指针

指向紧急数据的最后一个字节的位置

选项和填充

可变长度部分

TCP连接管理

三次握手

TCP两个主机完成连接,需要进行三次握手,确保两个主机真正实现了可靠地连接。

TCP的三次连接采用客户机/服务器模式,主动发出连接请求的我们称之为客户机,等待连接的称之为服务器

三次握手的过程如下图所示:

(1)客户机想要和服务器连接时,首先将首部的SYN设置为1,然后选择序列号为x。

(2)服务器收到连接请求之后,SYN和ACK都必须设置为1,才能进行连接,另外,设置序列号seq为y,期望收到的报文段的第一个字节的位置是ack=x+1

(3)客户机收到这个报文后,状态变成established.并且发送新的报文,ACK和SYS也毫无疑问是1,由于服务器期望收到的第一个字节是x+1,所以seq=x+1,而第二次握手 发送的seq为y,所以客户端希望收到的下一个报文段的第一个字节是y+1,也就是ack= y+1。

由此,三次握手完成。

四次挥手

TCP是有连接的,所以断开连接的时候,需要进行四次挥手,确保两个主机完全断开。

四次挥手过程如下图所示:

(1) 客户端传输完数据后,发送FIN=1,seq=m给服务器,请求断开连接,此时客户机就不能发送数据给服务器了

(2) 服务器端收到客户端发送的断开请求后,需要给服务器发送ACK=1,序列号seq=n,ack=m+1,这个时候从客户端到服务器的连接才真正的断开。服务器向客户端发送数据 ,客户端仍然要接受;

(3) 在服务器将数据传送完成后(假如有数据传输的情况),就要给客户端发送FIN=1,seq = u ,ACK = 1; ack=m+1

(4) 客户端收到需要给服务器端发送ACK=1,seq= m+1,ack=u+1

完成上述的四次挥手之后,连接还未真正断开,需要等待2MSL之后,才会完全断开。

注意:MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃