在面试时,会经常被问到TCP报文的一些细节,可以说TCP报文是不少企业用来考察面试者对网络的掌握程度的一道题目。
TCP连接作为网络传输的一个环节,是不可或缺的一部分。例如,OSI七层模型的应用层HTTP就是基于TCP连接实现的。
TCP连接的三次握手和四次挥手机制相信是每个后台开发人员耳熟能详的知识点,那么关于TCP的报文细节以及背后的原理是怎么样的呢?TCP是怎样借助报文来实现三次握手和四次挥手呢?笔者通过阅读书本和加上自己的理解。通过本文,来谈谈TCP报文首部以及报文首部背后的原理。
首先先粘上一张TCP报文图
好了,下面介绍一些基础的内容
TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段,一个TCP报文段分首部和数据两部分,其中很关键的就是TCP的报文头,TCP的全部功能都体现在首部中的各个字段中。
TCP报文段首部的前20个字节(上图有标识)是固定的,后面有4n字节(如果有选项最少为4字节)是根据需要添加的选项,所以TCP首部的最小长度是20字节。
1. 源端口号和目的端口号:
各2个字节,分别写入源端口号和目的端口号。端口就是我们熟悉的65536个套接字的端口号,显然,源端口号和目的端口号跟TCP的分用功能有着密切的关系,不同的应用使用不同的端口号,这样就可以互不干扰。而通信的双方的端口号必须相同,才能保证这一条通道是连接畅通的。
2.序列号(32位)
TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都是按顺序编号。整个要传送的字节流的起始序号必须在连接建立时就要设置。首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。例如一个报文段的序号字段值是101,它的长度是100,那么跟在它后面的报文的序号字段值就是从201开始。
3. 确认号(32位)
是期望收到对方下一个报文段的第一个数据字节的序号。例如TCP通信双方分别为A和B,在B正确收到A发送过来的一个报文段,例如就上面的101-200字节,那么B期望的收到下一个报文段就必须是从201开始。于是B在发送A的确认报文段中把确认号设置为201。
说到这里,上面叙述的三次握手机制的实现原理就比较清晰了,TCP连接通过序号和确认号精确地把一定长度的数据段从连接的一端传送到另一端。
4. 数据偏移
因为选项字段部分,数据偏移就显得尤为重要了。因为选项部分报文段的长度是4n,这个长度是不确定的,如果不标记这个报文段的报头长度,就无法确定报文段的数据部分是从哪一个字节开始,这样在解析报文的时候会出现麻烦。数据偏移就是为了解决这个问题而设计的。
5. URG(紧急)
当URG等于1时,表明紧急指针字段有用。它用来告诉系统,这个报文段中有紧急的数据,应该尽快发送。当紧急标志被置1的时候,紧急数据就会被放在本报文段的首部,这样做的好处是,让紧急数据尽快发送到TCP的接收方。例如:在一大段程序通过TCP连接从发送方发往接收方,已经发送了一部分,但由于一些原因,例如发送方发送了像Ctrl+C(通常为中断服务器服务)这类指令的时候,希望接收方尽快收到这样的紧急信号,如果放在数据报的末尾,未免太慢了,因为这两个字符会被放置在接收方缓存的末尾,在所有数据都被处理完毕后才交付到接收方的应用进程。
6. ACK(确认)
这个字段是TCP通信过程比较常见的字段。当ACK=1时,确认号字段才有效,而确认号字段在上文已经说过,是发送端希望接收端下一次发送的数据的序列号。TCP协议规定,当TCP连接建立之后,所有的发送的报文ACK都置为1。也就是说,ACK字段能够辨别TCP连接是否建立成功。如果是一个运维工程师,抓包来分析不同的字段,这个字段应该是再熟悉不过了。
7. PSH(推送)
有时当两个应用进程进行交互式的通信,有时在一段的应用进程希望在输入一个命令的时候得到接收方的响应,这个时候,TCP就可以使用推送操作。接收放收到推送字段置1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓冲都填满了再向上交互。但是据说实际上这个字段用得很少,因为TCP本身可以实现这个功能。
8. RST(复位)
当RST = 1时,表明TCP连接中出现了严重错误。例如主机崩溃或者其他原因,必须释放连接。然后在 重新建立运输连接。
9. SYN(同步)
在连接建立时用来进行同步的信号。当SYN = 1而ASK = 0时,表明这是一个连接请求报文。对方若同意建立连接,则在响应的报文段中使SYN = 1 ,ACK = 1。
10 .FIN(终止)
用来释放一个连接,当FIN = 1时,表明此报文段的发送方的数据已经发送完毕,并释放TCP连接,这个字段只有在TCP的四次挥手时候才会被置为1.
11.检验和
检验和字段检验(报文的)范围包括首部和数据两部分。在计算检验和时,都要在TCP报文段的前面添加12字节的伪首部。检验和有什么用?这关系到报文的正确性问题。为了保证TCP连接上传输的数据的正确性,即从发送方传送到接收方没有出现错误,用检验和来确定数据传输过程是否发生了错误。
12.紧急指针
紧急指针在URG = 1时才有意义,它指出本报文段中的紧
来源:https://www.cnblogs.com/thomson-fred/p/9926689.html