1、TCP服务的特点
2、TCP头部结构
2.1 固定头部结构
- ① 16位源端口号:告知目标主机该报文段来自哪里(哪个源端口)。客户端通常使用系统自动选择的临时端口号。
- ② 16为目的端口号:告知目标主机传给哪个上层协议或应用程序(目的端口)的。服务器使用特定端口号。
- ③ 32位序号(ISN初始序号):一次TCP连接中 某一个传输方向的 某个报文的数据部分的第一个字节的序号。第一个报文的第一个字节的序号是随机值,后面各个字节的序号逐个+1,增加到最大值,回到0重新加。
- ④ 32位确认序号:期望收到对方的下一个字节的序号。任意一方发送的TCP报文段不仅携带自己的序号,还携带对 对方发送来的报文段的确认序号。
- ⑤ 4位头部长度:指出TCP报文头部的长度,单位是4字节,头部最长60字节。
- ⑥ 6位标志位:
-
- ——URG:紧急指针是否有效
-
- ——ACK:确认号是否有效。携带ACK标志的TCP报文段为确认报文段。
-
- ——PSH:提示接收端应用程序应立即从TCP接收缓冲区中读走数据,为接受后续数据腾出空间。
-
- ——RST:要求对方重新建立连接。称携带RST标志的TCP报文段为复位报文段。
-
- ——SYN:请求建立一个连接。称携带SYN标志的TCP报文段为同步报文段。
-
- ——FIN:通知对方本段要关闭连接了。称携带FIN标志的TCP报文段未结束报文段。
- ⑦ 16位窗口大小:发送该报文段的一方的接收窗口大小,用于流量控制。
- ⑧ 16位校验和:发送端填充,接收端利用其进行CRC算法以检验传输中是否损坏。校验包括头部和数据部分。
- ⑨ 16位紧急指针:是个正的偏移量。他和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,准确的说,这个字段是紧急指针相对当前序号的偏移。称为紧急偏移更好。TCP的紧急指针是发送端向接收端发送紧急数据的方法。
2.2 TCP 头部选项
TCP头部的最后一个选项字段是可变长的可选信息。这部分最多包含40字节。典型的TCP头部选项结构如下图所示:
- 选项的第一个字段kind说明选项的类型。有的TCP没有后面两个字段,仅包含1字节的kind字段。
- 第二个字段length(如果有的话)指定该选项的总长度,该长度包括kind字段和length字段,共占2字节。
- 第三个字段info是选项的具体信息。常见的TCP选项有7种,如下图所示:
2.3 实验:使用tcpdump观察TCP头部信息
抓包结果:
3、TCP连接的建立和关闭
3.1 三报文握手,四报文挥手
3.2 半关闭状态
3.3 连接超时
3.4 TCP状态转移
TCP状态转移是指,TCP连接从建立到关闭的整个过程中,通信两端的状态变化。下图描绘了所有的TCP状态 以及可能的状态转换:
上图中,粗虚线表示典型的服务器端连接的状态转移;粗实线表示典型的客户端连接的状态转移。CLOSED 是一个假想的起始点,并不是实际的状态。
① 服务器的典型状态转移
② 客户端的典型状态转移
③ TIME_WAIT状态
在TIME_WAIT状态,客户端连接要等待一段长为2MLS(Maximum Segment Life,报文段在网络中最大生存时间)的时间,才能完全关闭。标准文档RFC1122的建议值是2min。
原因:
4、复位报文段
在某些特殊条件下,TCP连接的一端会向另一端发送携带RST标志的报文段,即 复位报文段,以通知对方关闭连接或重新建立连接。本节讨论产生复位报文段的3种情况。
4.1 访问不存在的端口
当一个主机访问一个不存在的端口时,目标主机将给他发送一个复位报文段。
下面进行一个实验来验证:
4.2 异常终止连接
发送复位报文段终止连接就是异常终止。
4.3 处理半打开连接
考虑下面的情况:服务器(或客户端)关闭或者异常终止了连接,而对方没有接收到结束报文段,此时,客户端(或服务器)还维持着原来的连接,而服务器(或客户端)即使重启,也已经没有该连接的任何信息了。我们把这种状态称为版打开状态,处于这种状态的连接称为半打开连接。
一句话概括就是:一方已经终止连接了,另一方还处于正常接受数据的状态。
如果服务器(或客户端)往处于半打开状态的连接写入数据,则对方将回应一个复位报文段。
下面进行实验验证:
5、TCP 交互数据流
TCP报文段所携带的应用程序数据 按照长度分为两种:
- 交互数据。交互数据仅包含很少的字节,使用交互数据的应用程序(或协议)对实时性要求高,比如telnet、ssh等。
- 成块数据。成块数据的长度通常为TCP报文段允许的最大数据长度。使用成块数据的应用程序对传输效率要求高,比如ftp。
5.1 交互数据流
5.2 TCP 成块数据流
直接上实验:
6、带外数据
某些传输层协议具有带外(Out Of Band,OOB)数据的概念,用于迅速通告对方本端发生的重要事件。因此,带外数据比普通数据有更高的优先级,他应该总是立即被发送,而不论发送缓冲区中是否有排队等待发送的普通数据。带外数据的传输可以使用一条独立的传输层连接,也可以映射到传输普通数据的连接中。实际应用中,带外数据的使用很少见,已知的仅有telnet、ftp等远程非活跃程序。
TCP发送带外数据的过程
7、TCP 超时重传
从本节往后都是讨论,异常网络状况下(出现超时或丢包),TCP如何控制数据传输以保证其承诺的可靠服务。
TCP模块为每个TCP报文段都维护一个重传定时器,定时器在TCP报文段第一次发送时被启动。如果超时时间内未收到接收方应答,TCP模块重传TCP报文段并重置定时器。下面通过实验研究Linux下TCP的超时重传策略。
8、拥塞控制
8.1 概述
先明确几个变量的含义:
- CWND拥塞窗口
- SWND发送窗口:发送端向网络一次连续写入的数据量
- RWND接收(通告)窗口
- SMSS:报文段数据部分最大长度
拥塞控制的最终受控变量 是发送端向网络一次连续写入的数据量,我们称为SWND。但发送端最终以TCP报文段来发送数据,所以SWND限定了发送端能连续发送的TCP报文段数量。
接受方可通过其接收窗口RWND控制发送端的SWND。但这显然不够,所以发送端引入了一个称为拥塞窗口的状态变量。实际的SWND值是RWND和CWND中的较小者。
8.2 慢启动 和 拥塞避免(未发生拥塞)
当发生拥塞时:
8.3 快速重传 和 快速恢复