TCP使用网络层(IP),提供了一种面向连接的、可靠的字节流服务。
面向连接意味着两个使用TCP协议的应用在彼此交换数据之前必须先建立一个TCP连接。
TCP使用以下方式来提供可靠服务:
- 应用数据被分割成TCP认为最适合发送的数据块。由TCP传递给IP的信息单位称为报文段或段(segment)。
- 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
- 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
- TCP将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检测在传输过程中的任何变化。如果收到的校验和有差错,TCP将丢弃这个报文段和不缺人收到这个报文段(希望发端超时并重发)。
- TCP报文段接收到的顺序是不确定的,所以TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
- IP数据包还会发生重复,TCP的接收端必须丢弃重复的数据。
- TCP还能提供流量控制。TCP连接的双方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。
一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。TCP对字节流不作任何解释。
TCP数据在IP数据报中的封装:
TCP包首部:
- 源端口号和目的端口号用于寻找发端和收端应用程序。两个端口号加上源端IP地址和目的端IP地址可以唯一确定一个TCP连接。一个IP地址和一个端口号称为一个Socket。
-
序号用来标识TCP发端向收端发送的数据字节流,表示在这个报文段中的第一个数据字节。无符号整数,到达
2^32-1
后又从0
开始。当建立连接时,SYN 标志变 1,序号字段包含由这个主机选择的该连接的初始序号 ISN(initial Sequence Number)。该主机发送的第一个字节的序号是这个 ISN 加 1,因为 SYN 消耗了一个序号。
确认序号包含发送确认的一端所期望接收到的下一个序号,应当是上次已成功收到数据字节序号加1。只有 ACK 标志为 1 时确认序号字段才有效。
TCP为应用层提供全双工服务,数据能在两个方向上进行传输,因此连接的每一端必须保持每个方向上的传输序号。
- 首部长度给出首部中 32bit 字的数目,所以TCP首部的长度范围是
[20-60]
个字节。 -
TCP首部中有 6 个标志比特,可被同时设置为 1 来表示该标志有效:
URG:紧急指针(urgent pointer)。
ACK:确认序号。
PSH:接收方应该尽快将这个报文段交给应用层。
RST:重建连接。
SYN:同步序号,用来发起一个连接。
FIN:发端完成发送任务,用于关闭。 -
TCP流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。
-
校验和覆盖了整个TCP报文段:TCP首部和TCP数据。由发端计算和存储,并由收端进行验证。(计算时校验和的字段先赋为 0 进行占位)
-
紧急指针只有在 URG 标志置为 1 时才有效,是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
-
选项用于可选字段,常见的有最长报文大小,又称为MSS(Maximum Segment Size)。
-
数据部分是可选的。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。