TCP协议分析和详细解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/deramer1/article/details/73527336

TCP协议是传输层协议,传输层要解决的问题是主机间进程之间的通信。

TCP提供的是面向连接的服务,它解决的问题是保证传输中数据的有序、可靠、无丢失、不重复的问题。它是面向字节传输的,是全双工通信。

一、TCP报文的格式



在介绍协议字段的含义之前,我先来说一下端口。

端口是传输层的SAP,是为了区别主机中的进程,比如,HTTP,FTP等都有一个固定的端口号,我们访问相应的端口,就是访问相应的服务,如果我们访问80端口,就是访问HTTP服务。

在上面的TCP协议格式中,我们可以看到端口由16位二进制数组成,它的大小是固定的2^16=65536个端口,其中,0-1023是知名端口,这些端口被分配给TCP/IP协议中一些重要的应用,1024-49151是登记端口号,这些端口号使用的时候,必须向IANA注册,防止重复。49152-65535是客户端使用的端口,客户端程序运行的时候分配,程序结束释放端口。

下面是一些知名端口的列举:
FTP :21             TELNET:23           SMTP:25      DNS:53         TFTP:69            HTTP:80           SNMP:161

下面是各个字段的的意义:

1.源端口和目的端口:各站两个字节


2.序号:四字节,TCP是面向字节的,它会为每一个字节编一个号码,其中这里的序号是本报文段发送的数据的第一个字节的序号。


3.确认序号:四字节,是期望收到下一个报文段第一个字节的序号,同时是对上一组序号的确认。例如:A向B发送数据,序号为200,报文段长200字节。那么B向A恢复的确认序号就是401,表示需要401开头的数据,同时确认收到前面的数据。


4.数据偏移:占四位,该数据偏移不是ip分片中的数据偏移,是指数据部分的开头到TCP开头的部分距离,就是整个TCP包头的长度,单位是4字节。


5.保留字段,占6位,目前这个字段可以忽略不计


6紧急位URG:当该位为一的时候,表示紧急指针启用。说明该报文中有紧急数据,需要尽快传入上层应用,数据的第一位到紧急指针的位置就是紧急数据。


7确认位ACK:当ACK为一的时候,确认序号才为有效的序号。否则确认序号无效。


8推送为PSH:当该位置一的时候,需要尽快将数据传入上层应用,而不用等整个缓存满了在上传。


9复位位RST:当该位置一的时候,说明TCP连接出现了问题,需要断开连接重新建立连接。


10同步位SYN:当该位为一的时候,说明这是一个请求连接或者连接接受报文,当A向B请求建立连接的时候,SYN=1,ACK=0。当B同意和A建立连接的时候,SYN=1,ACK=1.表示接受连接。


11终止位FIN:当该位置一的时候,说明数据已经传输完毕,请求释放连接。


12窗口:占两位,该位说明允许对方发送数据的多少,因为缓存区的有限,防止对方发送的数据过快,导致数据丢失。


13校验和:是对数据和报头的校验。


14紧急指针:说明该报文中有多少数据是紧急数据,紧急数据放在数据的开头。


15选项:长度可变。最初仅有一个选项字段,最大报文长度MSS


16填充字段:让整个报文长度是4字节的倍数。

二、TCP的可靠传输

TCP是为了在网络层不可靠传输的基础上提供一种可靠的数据传输。它使用了序号,确认,重传这三种方式来保证数据传输的可靠性。

1序号

TCP的传输是面向字节的传输,在它的眼里,虽然数据是没有结构的,但是数据是有序的,它为每一个字节数据进行编号来保证传输的有序。例如,现在有10字节的数据,TCP会为这10个字节的数据编号为0-9,假设数据分为三个报文段发送,分别为0-3,4-7,8-9这三段数据,那么第一个报文段的序号为0,第二个报文段的序号为4,第三个报文段的序号为8。

2.确认

TCP对收到的数据进行确认,确认号是下一次希望收到的数据,它采取累积确认的方式。

例如上面的例子:接受端收到数据0-3后,会向发送端发送报文,他的确认序号是4,表示确认收到0-3数据,希望下次收到4开头的数据。于是发送端发送4-7数据。具体的发送数据的大小由发送方的指定窗口决定。

3重传

重传有两种方式,一种是超时,一种是冗余ACK的发出

1、TCP的每一个报文发出之后,都会设置一个计时器,如果到时间没有收到相应的确认报文,说明报文丢失需要重新进行传递。

2、当接受端收到1、3、4号报文时,却没有收到2号报文,那么每当它收到比2号报文大的序号的报文,他都会发送一个ACK表示需要2号报文。

三、TCP的流量控制

TCP通过流量控制来匹配发送方和接收方速度不一致,导致缓存区溢出的问题。TCP是通过滑动窗口来实现的流量控制。在接受过程中,接受方会根据自己的缓存区大小的来动态的调整窗口的大小。它向接受方法送报文的窗口填入窗口的大小。这个窗口叫接收窗口。接受方自己会估计一个拥塞窗口(见下一节的介绍),发送方会选择拥塞窗口和接受窗口中小的一个来确定自己的发送窗口是多大。

四、TCP的拥塞控制

TCP的拥塞控制是为了防止过多的数据注入到网络中,导致路由器的过载发生溢出。拥塞控制是一个全局的过程,它考虑了整个网络的主机,路由器,是为了防止整个网络的的过载。而流量控制是为了协调接收方和发送方的速率,不至于数据溢出。

拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映了网络当前的容量,只要网络没有出现拥塞,拥塞窗口就大一些,出现拥塞就减小。

实行拥塞控制,有四种算法。分别是,慢开始,拥塞避免,快重传,快恢复。

1、慢开始

在TCP连接的时候,一开始令拥塞窗口的大小为一个MSS值,只要收到确认的信息。拥塞窗口的值就加倍。直到到达一个规定的阈值,然后改用拥塞避免算法。

例如,一开始拥塞窗口大小为一个MSS值,收到确认的信息之后,拥塞窗口的大小变为2个MSS值,在收到确认值,变为四个值。

2、拥塞避免

发送端的拥塞窗口,每经过一个确认的信息,窗口值就加一,一旦出现超时的情况,就把开始的阈值降到当前硬塞窗口值的一半。



在网络中的做法是这样:
拥塞窗口<阈值时:使用慢开始算法

拥塞窗口>阈值时:使用拥塞避免算法

拥塞窗口=阈值时:两个都可以,一般情况是拥塞避免

而当网络出现拥塞的时候,无论采取那一种拥塞避免算法,都会将阈值设为发生拥塞时的拥塞窗口值大小的一半,同时将拥塞窗口置1.

下面是对拥塞窗口应用的一个举例:


一开始将阈值设置为16,拥塞窗口设置为1

经过一次循环拥塞避免窗口为2,经过几次循环之后到达阈值16。

该用拥塞避免算法,经过次确认,拥塞避免窗口加一,知道等到24的时候,出现丢包

将阈值变为12,拥塞避免窗口为1,开始新的循环。

3、快重传

快重传技术利用冗余ACK来检测丢包的产生,并非取消重传计时器,而是在某种情况下,更早的重传报文

接收方收到失序报文的时候,向发送方发送ACK,当接受方连续三次收到ACK时,知道丢死报文,立即重传,而不是误认为网络拥塞。

4、快恢复

当发送方连续收到3个冗余ACK的时候,就把阈值和拥塞窗口都设置为发生失序的窗口的一半,由于跳过了开始窗口为一的部分,所以称为快恢复。

五、TCP的建立过程和实例分析



如上图为TCP建立过程示意图,在建立连接的过程中,双方需要确认对方的存在,同时协商一些参数问题(最大窗口值等),同时分配缓存区等。

首先,A向B发送请求建立连接的报文,SYN位置一,序号为X

B向A发送连接建立报文。SYN位置一,序号为y,确认序号为x+1,同时为该TCP建立缓存和变量

A向B发出确认的报文,SYN位置一,确认序号为y+1,同时为该TCP建立缓存和变量

(服务器端的资源分配是在第二次握手是建立,客户端是在第三次握手时建立)

下面是一组具体的报文


上面是TCP的第一次握手,可以看见源端口为1860,目标端口为21(FTP),序号为0,头长度为32字节,下面试标志位,SYN位置一,窗口为524280字节,校验和为0X14f5

下面是选项字段。

下面是TCP的第二次握手:

在这个报文里,可以看到确认序号为1,序号为0,ACK,SYN位置一

下面是第三次握手:

在这个报文里,看到确认序号,序号都是1,同时ACK置一

注:TCP报文里一些为0的选项就没有体现,只能在下面的16进制数中体现。

六、TCP的释放过程和实例分析


上面是TCP四次握手释放的过程:

首先,A向B发出请求释放连接,FIN位置一,序号为x

然后B向A发送确认,确认序号为x+1。这是B不再接受A的信息,但B可以向A发送信息。

B向A发送信息,请求释放,FIN位置一,序号为y

A向B发送确认,A和B连接终止。

下面是相应的报文:


上面是TCP释放第一次握手,可以看到ACK,FIN位置一



上面是TCP释放的第二次握手,ACK置一,完成单向的释放


上面是TCP连接第三次握手,ACK,FIN位置一


上面是第四次握手释放连接。整个TCP的释放完成。



以上是我对TCP协议的理解。

猜你喜欢

转载自blog.csdn.net/deramer1/article/details/73527336