TCP引入
规范和定义
TCP 提供了一种面向连接的 (cormection-Oriented)、可靠的字节流服务。面向连接的是指使用 TCP 的两个应用程序必须在它们可交换数据之前,通过相互联系来建立一个 TCP 连接。像广播和组播这些概念在 TCP 中都不存在。TCP的原始规范是 [RFC0793]。
可靠性
TCP 提供了可靠性机制,因为它传输的报文是字节流, 使用以下几种机制保证可靠性:
- 组包机制
TCP 必须把一个发送应用程序的字节流转换成一组 IP 可以携带的分组,称为组包。这些分组包含序列号,该序列号在 TCP 中实际代表了每个分组的第一个字节在整个数据流中的字节偏移, 而不是分组号。这允许分组在传送中是可变大小的,并允许它们组合, 称为重新组包。应用程序数据被打散成 TCP 认为的最佳大小的块来发送,一般使得每个报文段按照不会被分片的单个 IP 层数据报的大小来划分。 - 校验和-差错检测
用于检测传送中引人的比特差错。如果一个带无效校验和的报文段到达,那么 TCP 会丢弃它,不为被丢弃的分组发送任何确认。TCP 校验和使用的数学函数与其他互联网协议(UDP、 ICMP等)一样。 - 重传机制
- 发送端
当发送一组报文段时,它通常设置一个重传计时器,等待对方的确认接收。 TCP 不会为每个报文段设置一个不同的重传计时器。相反, 发送一个窗日的数据,它只设置一个计时器,当 ACK 到达时再更新。如果有一个确认没有及时接收到,这个报文段就会被重传。 - 接收端
当接收端接收到连接的另一端的数据时,它会发送一个确认。这个确认可能不会立即发送,而一般会延迟片刻。 TCP 使用的 ACK 是累积的,从某种意义来讲,一个指示字节号 N 的 ACK 暗示着所有直到 N 的字节 (但不包含N) 已经成功被接收了。
- 发送端
- 序列号
TCP 给应用程序提供一种双工服务,因此连接的每个端点必须对每个方向维持数据流的一个序列号。
TCP数据包中的序列号不是以报文段来进行编号的,而是将连接生存周期内传输的所有数据当作一个字节流,序列号就是整个字节流中每个字节的编号。一个 TCP 数据包中包含多个字节流的数据(即数据段),而且每个 TCP 数据包中的数据大小不一定相同。在建立 TCP 连接的三次握手过程中,通信双方各自已确定了初始的序号x和y,TCP 每次传送的报文段中的序号字段值表示所要传送本报文中的第一个字节的序号。
TCP 的报文到达确认(ACK),是对接收到的数据的最高序列号的确认,并向发送端返回一个下次接收时期望的TCP数据包的序列号(Ack Number)。例如,主机A发送的当前数据序号是400,数据长度是100,则接收端收到后会返回一个确认号是501的确认号给主机A。
使用序列号, 一个 TCP 接收端可丢弃重复的报文段和记录以杂乱次序到达的报文段。因为 TCP 使用 IP 来传递它的报文段, IP不提供重复消除或保证次序正确的功能。然而, TCP 是一个字节流协议, 绝不会以杂乱的次序给接收应用程序发送数据。因此, TCP 接收端可能会被迫先保持大序列号的数据不交给应用程序,直到缺失的小序列号的报文段全部接收。
TCP头部
image.pngimage.png
- 端口号:告知主机该报文段是来自哪里以及传给哪个上层协议或应用程序的。进行 TCP 通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号
- 序号:一次 TCP 通信过程中某一个传输方向上的字节流的每个字节的编号
- 确认号:用作对发送方发送来的 TCP 报文段的响应。其值是收到的 TCP 报文段的序号值加1
- 头部长度:标识该 TCP 头部有多少个 32bit 字(4字节)。因为 4 位最大能标识 15,所以 TCP 头部最长是60字节。
- URG 表示紧急指针是否有效
- ACK 表示确认号是否有效
- PSH 提示接收端的应用程序应该立即从 TCP 接受缓冲区中读走数据,为接受后续数据腾出空间
- RST 表示要求对方重新建立连接,携带 RST 标志位的 TCP 报文段成为复位报文段
- SYN 表示请求建立一个连接
- FIN 通知对方本端要关闭了,带 FIN 标志的 TCP 报文段为结束报文段
- 窗口大小:是 TCP 流量控制的一个手段。这里说的窗口,指的是接收通告窗口。它告诉对方本端的 TCP 接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度
- 校验和:由发送端填充,接收端报文段执行 CRC 算法以检验 TCP 报文段在传输过程中是否损坏。注意,这个校验不仅包括 TCP 头部,也包括数据部分
- 紧急指针:正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。TCP 的紧急指针是发送端向接收端发送紧急数据的方法。
- TCP头部选项:TCP 头部的最后一个选项字段是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。
网友评论