TCP服务特点
面向连接、基于字节流和可靠传输。
TCP的面向连接是什么意思?
通信双方都必须先建立连接,然后才能开始数据的读写,双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。
同时,TCP连接是全双工的,就是说,双方数据的读写,可以通过一个连接进行,完成数据交换之后,通信双方都必须断开连接,以释放系统资源。而且,TCP连接是一对一的,所以,基于广播和多播的应用程序不能使用TCP服务,而无连接协议UDP,倒非常适合广播和多播。
字节流服务和通信报区别
主要体现在通信双方是否执行相同次数的读写操作。
如图所示,当发送端应用程序同时执行多次写操作时,TCP模块必须先将这些数据放入发送缓冲区中,当TCP模块真正发送数据时,发送缓冲区中这些数据才会被封装成一个或多个TCP报文段发出,简言之,TCP模块发出的报文段个数与发送端应用程序执行的写操作次数之间没有固定的数量关系。
同时,当接收端收到一个或多个TCP报文段后,TCP模块要将它们携带的应用数据根据的TCP报文段的序号依次放入接收缓冲区中,同时通知应用程序读取数据。接收端应用程序可以将接收缓冲区中的数据一次读出,也可以多次读出,这取决于用户指定的应用程序读缓冲区大小,简言之,接收端应用程序执行的读操作次数与TCP模块接收到的TCP报文段个数也没有固定的数量关系。
总而言之就是,发送端执行的写操作数量和接收端执行的读操作数量之间没有任何的数量关系。
通信双方数据传输是没有边界的,这也就是TCP的字节流的概念。
而UDP的数据报截然相反,发送端应用程序每执行一次写操作,接收端应用程序都必须执行一次对应的读操作。否则,就会发生丢包。并且,如果用户没有指定足够的应用数据缓冲区来读取数据报,那么UDP数据报就会发生截断。
TCP的可靠传输是由何支撑的:
发送应答机制
发送端发送的每个TCP报文段都必须得到接收端的应答,才认为这个TCP报文段传输成功。
超时重传机制
发送端在发出一个TCP报文段之后,就开始定时,如果在定时时间内没有收到应答,就会重新发送这个报文段。
同时,TCP报文段最终是以IP数据报发送的,而IP数据报到达接收端时可能乱序、重复,TCP协议还会对接收到的TCP报文段重排、整理,再交付给应用程序。
而UDP数据报服务则不可靠,需要上层协议处理数据的确认和超时重传。
TCP头部结构
通过了解TCP头部结构,我们可以认识到传输层在TCP协议栈中的作用。
TCP头部信息用于指定通信源端端口,目标端端口,管理连接等这些任务。如下图所示:
32位序号
在一次TCP通信,从连接建立到释放连接的整个过程中,在某一个传输方向上的字节流的每个字节的编号就是由这个32位序号确认的。
在两个主机通信时,第一次发送的TCP报文段中,32位序号为系统给出的随机值,我们称它为初始序号(ISN),在该传输方向上,后续的TCP报文段中,序号,将被系统设置为ISN+该报文段所携带数据的第一个字节在整个字节流中位置的偏移。
另外一个传输方向上,亦然。
32位确认号
TCP报文段中,发送方不仅携带自己的数据序号,还携带对通信另一方所发送的数据的确认。
4位头部长度
标识该TCP头部有多少个4字节,最大值是15,所以TCP头部最大长度是60个字节。
6位标志字段
- URG:紧急指针是否有效。
- ACK:确认号是否有效(我们称携带ACK标志的TCP报文段为确认报文段)。
- PSH :push字段,提示接收端程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间,因为应用程序如果不把这些数据读走,这些数据会一直停留在TCP接收缓冲区中,这样会占用很大的内核资源。
- RST:要求对方重新建立连接(复位报文段)
- SYN:表示请求建立一个连接(同步报文段)
- FIN:通知对方关闭连接(结束报文段)
16位窗口大小
是TCP流量控制的手段。这里的窗口指接收通报窗口(Receiver window),提示本端TCP接收缓冲区还能容纳多少字节数据,这样对方就可以控制数据发送的速度。
16位校验和
由发送端填充,接收端对TCP报文段执行CRC算法,来检验数据是否损坏。该检验不仅包括头部,也包括数据部分。
表示最后一个紧急数据的下一字节序号。
40选项
kind类型 length总长度 info具体信息(常见TCP选项具体信息如下)
0:选项表结束选项
1:空操作选项。无特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍。
2:最大报文段长度选项。连接初始化时,通信双方使用该选项来协商最大报文段长度。TCP模块通常将最大报文段长度设为MTU-40,这里的40指20字节的TCP头部和20字节的TCP头部,这样一来,携带TCP报文段的IP数据报的长度就不会超过MTU。
ps:MTU即最大传输单元,该参数通常与通信接口有关(网络接口卡、串口等)。
3:窗口扩大因子选项。TCP连接初始化时,通信双方使用该选项协商接收通道窗口扩大因子的大小。因为在TCP协议中,接收通道窗口的大小是用16位表示的,也就是65535个字节,但实际上TCP模块允许的接收通道窗口远不止这个数目,比这个大是为了提高通信的吞吐量,窗口扩大因子就是为了解决这个问题。
如果窗口大小位N,而窗口扩大因子为M,那么窗口实际大小就是N*(2^M)。窗口扩大因子选项只能出现在同步报文段中,当连接建立成功之后,该值将固定不变。
4:选择性确认(SACK)选项。当TCP报文段发生丢失时,TCP模块就会重传最后被确认的TCP报文段之后的所有报文段,但这样的话,原先已经成功发送的报文段也可能重复发送,就降低了TCP模块的性能。选择定确认选项就是为了解决这个问题,它让TCP模块儿只重新发送丢失的TCP报文段。
5:SACK实际工作的选项。告诉发送端,本端已经收到的不连续的数据块,从而让发送端根据此选项重新发送丢失的数据块。其中块左边沿表示不连续块的第一个数据的序号,而块右边沿则表示不连续块的最后一个数据的序号的下一个序号。这样一对参数(块左边沿和块右边沿)之间的数据是没有收到的。因为一个块信息占用8字节,所以TCP头部选项中实际上最多可以包含4个这样的不连续数据块(考虑选项类型和长度占用的2字节)。
8:时间戳选项。提供比较准确的计算通信双方之间的回路时间的方法。