- 为了实现可靠传输、TCP采用了面向字节流的方式。
- TCP将应用进程交付下来的应用报文看做是字节流,存入TCP发送缓存中。
- 但TCP在发送数据时,是从发送缓存取出一部分或全部字节并给其添加一个首部格式使之成为TCP报文段后进行发送。
- 一个TCP报文段由首部和数据载荷两部分组成。
- TCP的全部功能都体现在它首部中各字段的作用。
首部格式
- 与IP数据报的首部格式类似:20字节的固定首部,最大40字节的扩展首部。
- 源端口:占16比特,写入源端口号,用来标识发送该TCP报文段的应用进程。
- 目的端口号:占16比特,写入目的端口号,用来标识接收该TCP报文段的应用进程。
- 举例
- 在浏览器地址栏中输入了Web服务器的域名后,浏览器进程会构建一个封装有HTTP请求报文的TCP报文段,该报文段首部中源端口字段会填写一个短暂端口号,用来标识发送该报文段的浏览器进程,目的端口号会填写熟知端口号80,因为使用HTTP协议的Web服务器进程默认监听该端口。
- Web服务器收到该TCP报文段后,从中解封出HTTP请求报文,并根据目的端口号80,将HTTP请求报文上交给Web服务器进程。Web服务器进程根据HTTP请求报文的内容进行响应处理,并构建一个HTTP请求响应报文。
- HTTP响应报文需要封装成TCP报文段发送,源端口号为80,标识发送该TCP报文段的Web服务器进程,目的端口号为刚才的短暂端口号。
- 序号seq:占32比特,取值范围为0~2^32-1,序号增加到最后一个后,下一个回到0。用来指出本报文段数据载荷的第一个字节的序号。
- 确认号ack:占32比特,取值范围同上,确认号也是增加到最后一个就又回到0。指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。
若确认号=n,则表明到序号n-1为止的所有数据都已正确接收,期望接收序号为n的数据。
- 确认标志位:取值为1时确认号字段才有效,取值为0时,确认号字段无效。
TCP规定,在建立连接后,所有传送的TCP报文都必须把ACK置1.
- 数据偏移:占4比特,并以4字节为单位。
用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远。
实际上指出了TCP报文段的首部长度。
首部固定长度为20字节,因此数据偏移量最小值为(0101)2, 首部最大长度为60字节,因此数据偏移字段最大值为(1111)2.
保留:占6比特,保留为今后使用,目前置0
窗口:占16比特,以字节为单位。指出发送本报文段的一方的接收窗口。窗口置作为接收方让发送方设置其发送窗口的依据。以接收方的接受能力来控制发送方的发送能力,称为流量控制。
校验和:占16比特,检查范围包括TCP报文段的首部和数据载荷两部分。
计算校验和时,要在TCP报文段的前面街上12字节的伪首部。
- 同步标志位SYN:在TCP连接建立时用来同步序号。
- 终止标志位FIN:用来释放TCP连接。
- 复位标志位RST:用来复位TCP连接。
当RST=1时,表明TCP连接出现了异常,必须释放连接,然后再重新建立连接。
RST置1,还可以用来拒绝一个非法报文段或拒绝打开一个TCP连接。
- 推送标志位PSH:接收方的TCP收到该标志位为1的报文会尽快上交应用进程,而不必等到接收缓存都填满后再向上交付。
- 紧急标志位URG: 取值为1时紧急指针字段有效;取值为0时紧急指针字段无效。
- 紧急指针:占16比特,以字节为单位,用来指明紧急数据的长度
当发送方有紧急数据时,可将紧急数据插队到发送缓存的最前面,并立刻封装到一个TCP报文段中进行发送。紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。
- 选项部分:最大40字节,增加选项可以增加TCP的功能:
- 最大报文段长度MSS选项:TCP报文段数据载荷部分的最大长度。
- 窗口扩大选项:用来扩大窗口,提高吞吐率
- 时间戳选项:
- 用来计算往返时间
- 用来处理序号超范围,又称为防止序号绕回PAWS。
- 选择确认选项:用来实现选择确认功能。
- 填充:由于选项的长度可变,因此使用填充来确保报文段首部能被4整除。因为数据便宜字段是以4字节为单位的。