传输层的协议主要有三个:TCP协议(可靠)、UDP协议(不可靠)和SCPT协议(不可靠)。
TCP协议也称传输控制协议,是一种可靠的、面向连接的、基于字节流的传输层通信协议。
TCP协议是TCP/IP协议族中的一个重要的协议。和IP协议相比,TCP协议更靠近应用层,因此在应用程序中具有更强的可操作性。一些重要的socket都和TCP协议相关。
使用 TCP 协议通信的双方必须先建立 TCP 连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。在传送数据完毕后,通信双方都必须断开已经建立的 TCP 连接以释放资源。
TCP协议采用发送应答机制,即发送端发送的每个TCP报文段都必须得到接收方的应答,才认为这个TCP报文段传输成功。
TCP协议采用超时重传机制,发送端在发出一个TCP报文段之后启动定时器,如果在定时时间内未收到应答,它将重发该报文段。
TCP报文段最终是以IP数据报发送的,而IP数据报到达接收端可能乱序、重复,多以TCP协议还会对先接收到的TCP报文段重排、整理,再交付给应用层。
TCP协议基于字节流中的“流”指的是流入到进程或从进程流出的字节序列。基于流的数据没有边界(长度限制),它源源不断地从通信的一端流入另一端,发送端可以逐个字节地向数据流中写入数据,接收端也可以逐个字节地将它们读出。
当发送端应用程序连续执行多次写操作时,TCP模块先将这些数据放入TCP发送缓冲区中。当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或多个TCP报文段发出。因此,TCP模块发送出的报文段的个数和应用程序执行的写操作次数之间没有固定的数量关系。 当接收端接收到一个或多个TCP报文段后,TCP模块将它们携带的应用程序数据按照TCP报文段的序号依次放入TCP接收缓冲区中,并通知应用程序读取数据。接收端应用程序可以将TCP接收缓冲区中的数据一次性全部读出,也可以分多次读取,这取决于用户指定的应用程读缓冲区的大小。因此,应用程序执行的读操作次数和TCP模块接收到的TCP报文段的个数之间也没有固定的数量关系。
如图所示:
TCP协议允许通信双方的应用进程在任何时候都能发送数据。TCP协议连接的两端都设有发送缓存和接收缓存用来临时存放双向通信的数据。
TCP头部信息出现在每个TCP报文段中,用于指定通信的源端端口,目的端端口,管理TCP连接等。
TCP固定头部结构如下图所示:
16位端口号:告知主机该报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)。进行TCP通信时,客户端通常使用系统自己选择的临时端口号,而服务器则使用知名的端口号。
32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。假设主机A和主机B进程TCP通信,A发送给B的第一个报文段中,序号值被系统初始化为某个随机值ISN。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将被系统设置成ISN加上该报文所携带数据的第一个字节在整个字节流中的偏移。例如,某个TCP报文段传送的数据是字节流中的第1025~2048字节,那么该报文段的序号值就是ISN+1025.另外一个传输方向(从B到A)的TCP报文段的序号值也具有相同的含义。
32位确认号:用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。假设主机A和主机B进行TCP通信,那么A发送出的TCP报文段不仅携带自己的序号,而且还包含对B发送来的TCP报文段的确认号。反之,B发送出的TCP报文段也同时携带自己的序号和对A发送来的报文段的确认号。
4位头部长度:标识该TCP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以TCP头部最长为60字节。
6位标志位:
①URG标志:表示紧急指针是否有效。
②ACK标志:表示确认号是否有效。称携带AC标志的报文段位确认报文段。
③PSH标志:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。
④RST标志,表示要求对方重新建立连接。称携带RST标志的TCP报文段为复位报文段。
⑤SYN标志:表示请求建立一个连接。称携带SYN标志的TCP报文段为同步报文段。
⑥FIN标志:表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段为结束报文段。
16窗口大小:是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
16为校验和:由发送端填充,接收端对TCP报文段执行CRC算法以校验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。
16为紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。因此,确切地说,这个字段是紧急指针相对当前的序号的偏移,称为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。