引言
TCP全称传输控制协议(Transmission Control Protocol),它是一种传输层通信协议,提供了面向连接的、可靠的字节流服务。本文将会简要介绍TCP为应用层提供的服务以及TCP首部中的各个字段,并在后续的文章中详细介绍。
TCP的服务
TCP提供一种面向连接的、可靠的字节流服务。
什么是面向连接:一种网络协议,依赖发送方和接收器之间的显示通信和阻塞以管理双方的数据传输。网络系统需要在两台计算机之间发送数据之前先建立连接的一种特性。
举个例子,AB两地被一条河隔开了,一群在A的人想要去B。
如果他们是一群面向连接的人,那他们就会先在河上架座桥再过去。
因为架桥也是需要时间的,所以面向连接的效率通常不高。
相对的,使用UDP的面向无连接的人会这么干:”GOGOGO,RUSH B!“,然后跳下河游向对面,可能有的狼灭很快啊,直接就游到了对面,比搭桥不知道快到哪里去了;可能有的人直接白给,被水冲到不知道哪里去;也可能有人从不知道哪里过来了。最后,可能有的人早就到了,有的人很迟才来,有的人就失踪了。
因为TCP是面向连接的,所以两个使用TCP的应用(通常是一个客户和一个服务器)在通信之前必须先建立一个TCP连接。这就好像过河前要先造桥。而且面向连接的这帮人只会从这座桥上过去,只会从A过桥到B,因此TCP不支持广播和多播。当然,我们说TCP是可靠的,光造桥肯定是不行的,还需要更多的措施。
保证TCP可靠的主要措施有:
- 超时重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
- 确认应答:当一端收到发自TCP连接另一端的数据,它将发送一个确认。
- 序列号:对于每一个发送的数据报,TCP会对其进行编号。
- 按序到达:TCP报文段作为I P数据报来传输,而 IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
- 流量控制: TCP连接的每一方都有固定大小的缓冲空间。 TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲
区溢出。
- 拥塞控制:TCP会根据当前的网络拥堵状态,调整发送数据的大小
- 校验和:TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
以上内容会在后续详细介绍。
TCP首部
TCP数据被封装在一个IP数据报中。
TCP首部的数据格式如下,不计任选字段时,通常为20字节。
因为后面的字段会和标志比特有关,所以先介绍6个标志比特的作用:
URG |
紧急指针(urgent pointer)有效 |
ACK |
确认序号有效 |
PSH |
接收方应该尽快将这个报文段交给应用层 |
RST |
重建连接 |
SYN |
同步序号用来发起一个连接 |
FIN |
发端完成发送任务 |
-
源端口号和目的端口号:每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。
-
序号:序号用来标识从发端发送至收端的数据字节流,表示这个报文段中的第一个数据字节。序号是32bit的无符号数,到达2^32-1后从0开始。当建立一个新的连接时,SYN会置1,序号字段包含由这个主机选择的该连接的初始序号ISN(Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个 ISN加1,因为SYN标志消耗了一个序号。
-
确认序号:确认序号包含确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加 1。只有ACK标志为 1时确认序号字段才有效。
-
首部长度:首部长度说明首部中有多少个32bit字。需要这个值是因为任选字段的长度是可变的。这个字段占4 bit,因此T C P最多有60字节的首部。没有任选字段,正常的长度是 2 0字节。
-
窗口大小:该字段用于维护TCP的滑动窗口,TCP的流量控制便是由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个 16bit字段,因而窗口大小最大为 65535字节。
-
校验和:检验和覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。采用16bit二进制反码求和计算校验和,详细计算过程可以在网上搜索。
-
紧急指针:只有当URG标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
-
选项:最常见的可选字段是最长报文大小,又称为 MSS (Maximum Segment Size)。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN标志的那个段)中指明这个选项。它指明本端所能接收的最大长度的报文段。
参考《TCP-IP详解卷1:协议》17章并进行整理