首页 理论教育 TCP协议的工作原理

TCP协议的工作原理

时间:2023-06-30 理论教育 版权反馈
【摘要】:图2-3-31TCP 协议的报文格式下面分别给出TCP 报头的各个字段含义。图2-3-32TCP 协议的报文实例第3、4 字节是目的端口号,其数据值为“d6 05”,转换成十进制数为54789,表明目的端口号为54789。第9 ~12 字节是确认序号字段,值为“00 5b e3 60”,转换成十进制数为6021984,表明该TCP 报文携带有确实信息,确认收到数据流字节中最后字节编号为60219833 的数据包。剩下的12 字节是TCP 首部的操作选项。TCP 协议是一种面向连接的、可靠的传输层协议。

TCP协议的工作原理

传输控制协议(TCP)提供了可靠的报文流传输和对上层应用的连接服务,TCP 按顺序应答,能够按需重传报文。

TCP 将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据;TCP 提供端到端的流量控制,并计算和验证一个强制性的端到端检验和。

1.TCP 报文的封装

TCP 报文和UDP 报文一样被封装在IP 数据报中,IP 数据报再封装到链路层数据帧中,才可以通过物理线路在网络中进行传送。当IP 首部中的“协议”字段的值为“06”时,表明该IP 数据包所携带的是TCP 报文。TCP 报文在IP 数据报中的封装格式如图2-3-30 所示。

图2-3-30 TCP 报文在IP 数据报中的封装格式

2.TCP 报文格式

TCP 报文格式由TCP 报文首部和数据两部分组成,如图2-3-31 所示。如果不算选项部分,TCP 报头一般为20 字节。

图2-3-31 TCP 协议的报文格式

下面分别给出TCP 报头的各个字段含义。

(1)源端口: 用于指示源端口的数值。

(2)目的端口: 用于指示目的端口的数值。

(3)序号: 发送的数据流中第1 字节。TCP 为数据流中每字节编连续的序号。如果本条报文携带的数据流长度为m 字节,则下一条TCP 报文的序号应该编为本序号加m,记为n,那么下一条发送的数据流中第一个数据的序号应该为n (特例: 握手数据包占1 字节序号)。

(4)确认序号: 期望收到对方下次发送的数据的第1 字节的序号。假设确认序号为n,则表明确认收到数据流字节中最后字节编号为n-1 的报文。

(5)首部长度: 给出首部中32 位字(即4 字节长的字)的数目,即用该字段值乘以4就是TCP 首部的长度。需要这个字段是因为任选字段的长度是可变的,这个字段占4 位,因此TCP 最多有60 字节的首部。如果没有任选字段,则TCP 首部正常的长度是20 字节。

(6)保留域: 不被使用,但是它必须置0。

(7)控制位: 共占6 位。置1,表示该位有效;置0,表示该位无效。

●U (URG): 紧急指针是否有效。

●A (ACK): 确认序号是否有效。

●P (PSH): 接收方是否需要尽快将该报文交给应用层

●R (RST): 连接复位是否有效。

●S (SYN): 同步序号是否有效。

●F (FIN): 完成任务是否有效。

(8)窗口: 指示接收方将要接收的数据字节数。TCP 的流量控制由连接的每一端通过声明的窗口大小来提供。

(9)检验和: 报文头和内容按1 的补码和计算得到的16 位数。假如报文头和内容的字节数为奇数,则最后应补足一个全0 字节,形成检验和,注意补足的字节不被送上网络发送。

(10)紧急指针: 只有当URG 标志置1 时才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一字节的序号。TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

(11)选项: 可能在报文头的后面被发送,但是必须被完全实现并且是8 位长度的倍数。

3.TCP 报文的实例分析

用Wireshark 截获的一条TCP 报文如图2-3-32 所示。

接下来,对照图2-3-21 和图2-3-22,分析具体的TCP 报文的封装和数据格式。

该数据帧共66 字节,前14 字节是以太网数据帧的首部,接着的20 字节是IP 数据报首部。观察IP 数据报首部的第10 字节(即协议字段),其数据值为“06”,对应的十进制数为6,表明IP 数据报里封装的是TCP 报文。

在IP 数据报首部后面紧接的就是20 字节的TCP 首部:

第1、2 字节是源端口号,其数据值为“00 50”,转换成十进制数为80,表明源端口号为80。TCP 的80 号端口是众所周知的HTTP 服务,因此,表明该TCP 报文里封装的是HTTP报文,是HTTP 服务器发出的应答数据包。

图2-3-32 TCP 协议的报文实例

第3、4 字节是目的端口号,其数据值为“d6 05”,转换成十进制数为54789,表明目的端口号为54789。

第5 ~8 字节是序号字段,值为“92 6e 5e 0d”,转换成十进制数为2456706573,表明该TCP 报文的序号为2456706573。

第9 ~12 字节是确认序号字段,值为“00 5b e3 60”,转换成十进制数为6021984,表明该TCP 报文携带有确实信息,确认收到数据流字节中最后字节编号为60219833 的数据包。

第13 字节数据值为“80”,可知前4 位值为8,这是“首部长度”字部,表明该TCP报文的首部长度为32 字节,即有8 字节的选项内容。

第14 字节数据值为“12”,写成二进制形式为“00010010”,后六位为“010010”,分别对应6 个控制位,表明ACK 位和SYN 位有效,其余各位无效,即表明该TCP 数据包携带了有效的确认信息,同时该数据包是一个同步数据包,是三次握手( “三次握手”将在“TCP 的连接管理”中介绍)中的一个数据包。

第15、16 字节是窗口字段,其数据值为“72 10”,转换成十进制数为29200,表明接收方期望收到最多29200 字节。

第17、18 字节是检验和字段,其数据值为“52 bb”,经计算,确认数据正确。

第19、20 字节是紧急指针字段,其数据值为“00 00”,该TCP 数据包的控制位URG 置0,即表示紧急指针无效。

剩下的12 字节是TCP 首部的操作选项。

4.TCP 的连接管理

TCP 运输连接分三个阶段: 建立连接、传送数据和释放连接。

TCP 协议是一种面向连接的、可靠的传输层协议。面向连接是指一次正常的TCP 传输需要通过在TCP 客户端和TCP 服务器端建立特定的虚电路连接来完成,该过程通常称为三次握手;可靠性可以通过很多种方法来提供保证,在此主要关注数据序列和确认。TCP 通过数据分段(segment)中的序列号来保证所有传输的数据可以在远端按照正常的次序进行重组,而且保证数据传输的完整性。

一个连接由四维参数(源IP 地址、目的IP 地址、源端口号、目的端口号)唯一确定,因此一台主机可以同时和目标主机的同一端口建立不同的连接。TCP 数据通过某连接进行传送。释放连接是指针对某确定的连接进行释放。

1)建立连接

要通过TCP 传输数据,就必须先在两端主机之间建立连接。例如,TCP 客户端主动和TCP 服务器端建立连接,过程如图2-3-33 所示。

图2-3-33 TCP 经三次握手建立连接的过程

在第1 步,客户端向服务器端提出连接请求。这时,TCP SYN 标志置位。客户端告诉服务器端序列号区域合法,需要检查。客户端在TCP 报头的序列号区中插入自己的ISN。服务端收到该TCP 分段后,在第2 步以自己的ISN 回应(SYN 标志置位),同时确认收到客户端的第一个TCP 分段(ACK 标志置位)。在第3 步中,客户端确认收到服务器端的ISN (ACK标志置位)。到此为止建立完整的TCP 连接,开始全双工模式的数据传输过程。图2-3-34所示为Wireshark 抓包的结果,从中可以看到该实例三次握手的交互过程:

图2-3-34 TCP 经三次握手建立连接的抓包数据实例

第1 帧数据是客户端的50456 端口向服务器的80 端口提出连接请求,控制位SYN 置1,同时,这是第1 次握手包。SEQ =1482399473,表明客户端向服务器端方向发送的数据流的起始序号为1482399474 (握手包占1 字节)。

第2 帧数据是服务器端回应连接请求的数据包,控制位SYN 置1,这是第2 次握手包。SEQ =1626443103,表明服务器端往客户端方向发送的数据流起始序号1626443103(握手包占1 字节)。ACK =1482399474,表明收到了客户端发来的序号为1482399474 减1的数据包,即收到了客户端发来的第1 次握手包,同时期望收到下一条序号为1482399474的数据包。

第3 帧数据是客户端发给服务器的确认数据包。ACK =1482399474,表明收到了服务器发来的序号为1626443104-1 的数据包,即确认收到了服务器发来的第2 次握手包。这是第3 次握手包。(www.xing528.com)

2)释放连接

释放连接是指,通过四次挥手,释放已建立的连接,即两端分别发送一个控制位FIN 置1 的数据包,再分别发送一个确认收到对方发送的FIN 数据包。释放连接的抓包数据实例如图2-3-35 所示,共4 个数据包,从第10 帧到第13 帧。

图2-3-35 TCP 经四次挥手释放连接的抓包数据实例

第10 帧数据的TCP 首部“控制位”字段,值为“11”,即“ACK”位和“FIN”位有效,表明这是一个确认包,也是一个FIN 数据包,是源端172.22.97.24 向目标主机172.22.97.23发送的释放连接的数据包。

第11 帧数据是目标主机172.22.97.24 回应源主机172.22.97.23 的确认包,表明收到了FIN 数据包。

第12 帧数据是目标主机172.22.97.24 向源主机172.22.97.23 发送的释放连接的数据包。

第13 帧数据是源主机172.22.97.24 回应目标主机172.22.97.23 的确认包,表明收到了FIN 数据包。

经过以上4 个数据包的交流后,源主机和目标主机正式断开连接。

5.TCP 序号和确认序号的实例分析

接下来,对登录172.22.97.23 网站的过程进行抓包,以便加深对TCP 首部中的“序号”和“确认序号”的理解图2-3-36 所示中的第4 帧数据是客户端发给服务器的一个HTTP 请求数据包,第5 帧数据是服务器发回的确认数据包,第10 帧是客户端继第6 帧后发给服务器的下一个数据包。

详细分析第4、5、10 帧数据TCP 首部中的“序号”和“确认序号”的值,可以深刻理解TCP 协议的“确认机制”“可靠服务”等概念。

图2-3-36 TCP 的“序号”和“确认序号”实例1

图2-3-36 中第4 帧数据的数据内容显示其序号为“5c 88 af fe”,即1552461822。那么,怎样计算客户端下一条发送的数据包的序号呢? 根据“序号”的定义可知,必须先求出本条TCP 数据包所携带的数据字节数m。由TCP 首部和IP 首部字段的定义,可以写出如下计算m 的公式:

m =IP “总长度”-IP “首部长度”-TCP “首部长度”

在本例中,IP “总长度”为“01 18”,即280 字节;IP “首部长度”为“5”,即20 字节;TCP “首部长度”为“5”,也表示20 字节,所以m 等于240 字节。

因此,客户端发给服务器的下一条TCP 数据包的序号应该是1552461822 +240,即1552462062。

分析第5 帧数据: 这是服务器发给客户端的数据,数据内容如图2-3-37 中“数据内容显示”子窗口所示(即图中的下3 行数据),其“确认序号”字段的值为“5c 88 b0 ee”,即1552462062,表明收到了序号为1552462062-1 字节的数据,即172.22.97.23 服务器收到了主机172.22.97.24 发送的第5 帧数据。

图2-3-37 TCP 的“序号”和“确认序号”实例2

分析第6 帧数据: 这是主机172.22.97.24 发送完第6 帧数据后,发送给服务器的下一条数据帧。数据内容如图2-3-38 中“数据内容显示”子窗口所示,其“序号”字段的值为“5c 88 b0 ee”,即1552462062,从而验证了分析第6 帧数据时计算出的下一条数据的“序号”值是正确的。

图2-3-38 TCP 的“序号”和“确认序号”实例3

6.TCP 的检验和

用Wireshark 抓取的TCP 报文如图2-3-39 所示,由此可知TCP 的检验和是07e8。

图2-3-39 TCP 报文检验和

检验和不仅包含整个TCP 报文,还覆盖一个虚头部,虚头部包含源IP 地址、目的IP 地址、协议号及TCP 报文的总长度(头部+数据)。

源IP 地址: c0a8 0a08。

目的IP 地址: ac16 6113。

协议号: 0006。

TCP 报文的总长度(头部+数据): 0020 (TCP 报文总长度)共32 字节。

TPC 检验和的算法如下:

(1)将校验和置为“0000”,然后将检验和计算部分的值按16 位累加:

0006 (协议号)+c0a8 +0a08 (源IP 地址)+ac16 +6113 (目的IP 地址)+

0020 (TCP 报文总长度)+0be5 +0050 +3a9d +4881 +0000 +0000 +8002 +ffff +

0000 +0000 +0204 +05b4 +0103 +0303 +0101 +0402 (TCP 数据部分)=3f814

(2)将溢出的3 和尾部数据相加:

f814 +3 =f817

(3)用ffff 减法算出结果:

ffff-f817 =07e8

计算结果和TCP 报文的检验和完全一致,说明数据在传输过程中没有差错。

7.TCP 协议的探讨

(1)TCP 协议是传输层的协议,它是一个重要的传输协议。TCP 协议提供了可靠性的传输服务。TCP 连接是全双工的,即通信双方可以同时发送和接收数据。TCP 提供的是面向连接的服务,一个应用程序必须先请求一个到目的地的连接,然后才能使用这一连接传输数据。TCP 确保通过一个连接发送的数据时,数据可以正确地到达目的地,且不会发生数据丢失和乱序的情况。

(2)TCP 运输连接分三个阶段: 建立连接、传输数据、断开连接。通过三次握手来建立连接;一旦建立连接,就马上利用这条专用通道传输数据;数据传输完后,立即通过四次挥手断开连接,腾出信道给其他应用程序传输数据。TCP 的工作过程和UDP 完全不同,UDP 不建立连接,当然也就不存在断开连接;UDP 不建立专用通道,而TCP 要建立专用通道来传输数据。通过前面的实验可以知道,UDP 在接收方没有准备接收数据时,仍然可以传送数据。但是对于TCP 来说,如果接收方没准备接收数据,就不可能建立专用连接,也就不可能正常传输数据。一个完整的TCP 连接过程如图2-3-40 所示。

图2-3-40 一个完整的TCP 连接过程示例

从图2- 3- 40 可以看出,第1 ~3 帧数据是TCP 的三次握手,由此将IP 地址为192.168.1.111 的客户机和IP 地址为101.4.60.122 的服务器建立连接。客户机的端口是3299,服务器的端口是80。在TCP 层面的连接是指端口的连接。建立连接后,SEQ 是2891729924,ACK 是3579789825。第4 帧数据表示在三次握手后,客户机向服务器提出了HTTP 请求;第5 帧数据是确认请求;第6 帧数据是服务器向客户机发了一个HTTP 的应答报文;接下来是客户机和服务器断开连接的四次挥手过程。

(3)TCP 使用滑动窗口技术来实现流量控制,滑动窗口接收方根据自己接收数据来限制发送方数据的传输。在TCP 的每一个报文中都有一个接收窗口参数(receive window)。这个值的大小就是本机目前缓冲区的大小,即还能接收多少字节数据。窗口参数在TCP 报文中占1 字节。发送方在收到TCP 报文时,根据窗口数值的大小就可以知道接收方可以接收多少数据。在图2-3-40 中的第1 帧TCP 报文中,看到“Win =65535”,这说明客户机目前的数据缓存去可以接收64 KB 的数据。从图2-3-41 中可以看到,第1 帧数据的窗口参数为0,Reset (RST)位为1,连接被置位停止传输数据。

图2-3-41 Reset =1,连接被置位停止传输数据,WIN =0

(4)TCP 为了保证传输质量,还有重传机制,即发送方一旦收到2 个重复的ACK 报文,就立即重发报文,而不必等到定时器的定时到期。重传报文的例子如图2-3-42 所示。

图2-3-42 TCP 重传报文示例

在图2-3-43 中可以清楚地看到,第13 帧数据和第15 帧数据完全一样,这说明第15帧数据是第13 帧的重传数据;另外,还可以看到两个完全一样大的ACK 报文,即第14 帧数据和第16 帧数据完全相同。它们的ACK 值都为771818451,这就进一步证明了TCP 重传的第13 帧数据。TCP 利用数据重传技术,保证了数据的传输质量,在这一点上,TCP 的传输质量比UDP 高。

(5)TCP 是一个非常复杂的协议,它有很多控制技术,如连接管理、流量控制、拥塞控制和选择重传等。事实上,TCP 协议比本书所介绍的更复杂,在此回避了一些复杂的算法,只是用网络中的真实报文来介绍TCP。也许有人会提出这样的问题: 既然TCP 这么好、可靠性这么高,为什么有的地方还要用UDP 呢? 不如都用TCP? 其实,TCP 固然好,但是在某些应用领域就不适合,甚至它的优点变成了缺点。例如,对于流媒体来说,TCP 就不适合,因为其协议复杂且网络开销大,如果使用TCP 传输流媒体,当遇到传输失败就会重传,那么语音听起来将经常重复。所以,UDP 和TCP 各有特色,不能相互取代。

(6)TCP 是传输层的协议,所以在计算检验和的时候和UDP 一样,要把数据项算入,因为在应用层的服务程序将不再计算检验和。从这里可以知道,在网络中的数据检验是在传输层完成的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈