TCP---传输控制协议
是一种面向连接的可靠传输协议。
特点:
-
TCP是面相虚连接的传输层协议。
-
每一条TCP连接有且只能有两个端点,即每一条TCP连接只能是点对点的。
-
可靠、有序、无丢失、不重复。
-
TCP提供全双工通讯。
-
发送缓存
-
应用程序发送给发送方TCP准备发送的数据
-
TCP已发送但是尚未收到确认的数据
-
-
接收缓存
-
按序到达但未被应用程序处理的数据
-
乱序到达的数据
-
-
-
TCP是面向字节流的。
TCP连接的四元组:源IP、源端口、目IP、目端口。 套接字---->IP:port
TCP报文段
确认序列号:1、该序列号表示接收方期望收到发送方发送的下一个字节的序号。 2、代表接收方已收到该确认序列号之前的所有字节。 窗口值:指发送方可以不需要接收确认报文,就可以连续发送的数据最大量。 选项字段:MSS、时间戳、选择确认机制、窗口因子;
TCP的确认机制被称为累积确认。
确认位ACK:当ACK=1时,确认序列号字段有意义。在TCP连接建立后,所有传输的报文都必须将ACK置为1. 同步位SYN:代表连接请求。 终止位FIN:表明此报文段发送方数据已全部发送完毕,要求释放连接。 复位RST:表明TCP连接出现严重错误,必须释放连接,并重新建立新的传输连接。 紧急位URG:当URG=1时,表明此报文中存在紧急处理的数据,是高优先级数据,应尽快交付应用程序处理。遇紧急指针配合使用。 推送位PSH:接收方应尽快交付接收应用进程,不在等待缓冲区填满再向上交付。
TCP的可靠性机制
排序机制
MTU:最大传输单元--->包含数据部分、传输层头部、网络层头部--->以太网中默认值为1500字节 MSS:最大段长度--->仅包含数据部分
在本地设备上,如果进行了分段操作,则无法进行分片操作。
确认机制
重传机制
RTT:往返时间,指的是发送方将数据发出后,到他接收到对端反馈的确认报文的完整时间段。 RTO:超时重传时间:略大于RTT时间。
RTO时间是动态的变化时间。会进行超时间隔时间加倍。
超时重传---快速重传机制
客户端通过服务端的反馈信息从而进行数据重传的方式被称为快速重传机制,此时的重传并非是因为RTO时间到达而触发,而是因为客户端连续收到三个冗余ACK报文。--->快速重传机制会在RTO定时器超时之前重传报文段,从而解决超时重传时间加倍导致的延迟增大问题。
为了加快重传效率,将累计确认机制修改为SACK机制(选择确认机制),在TCP首部中的选项内容中携带未收到的数据字段,从而引发客户端重传。
TCP流量控制机制
窗口:指接受方可以在不接收确认报文的前提下,一次性发送的数据最大量。 接收方会在连接建立之前创建一个接收缓存,用以存放发送方发送的数据。而窗口大小在最初等于接收缓存大小。之后,窗口大小等于缓存大小减去已存在缓存中的数据量(rwnd---接收窗口大小)。 发送方根据每一次接收到的确认报文中的窗口字段,及时调整发送缓存大小,确保发送缓存用于小于等于窗口值。
TCP连接管理
TCP连接的建立
TCP建立连接的前置条件或需要解决的问题: 1、每一端知晓对端的套接字 2、进行参数协商(MSS、窗口值、是否使用选择确认机制、窗口扩大因子、时间戳) 3、设备对资源进行分配
TCP存在一个保活计时器,该计时器2小时时间。若该计时器时间内没有收到任何客户端的数据,服务端会发送一个探测报文段,并每隔75秒发送一次。若连续发送10个探测报文仍没有反应,则服务器认为客户端出现故障,关闭连接。
TCP连接的释放
1、是为了释放在之前分配给TCP进程的资源 2、本地所有数据已传输完毕
TCP的三次握手四次挥手
- 三次握手
第1次握手:客户端发送一个带有SYN标志的数据包给服务端。客户端发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成数值)
第2次握手:服务端接收成功后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了。服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由回复端随机生成的,并且将SYN置为1,而且会产生ACK字段,ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP建立请求已得到验证。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ack加1可以理解为是确认和谁建立连接。
第3次握手:客户端再回传一个带有ACK标志的数据包,表示我知道了,握手结束。客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,在服务端发过来的seq上加1进行回复。(SYN=1,ACK=y+1,seq=x+1)
其中:SYN标志位数置1,表示建立TCP连接;ACK标志表示验证字段。
- 四次挥手
第1次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN-WAIT-1状态。客户端发送断开TCP连接请求的报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x由客户端随机生成)
第2次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE-WAIT状态。服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y由服务端随机生成)
第3次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST-ACK状态。服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输数据完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z由服务端随机生成)
第4次挥手:客户端收到FIN后,客户端t进入TIME-WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手。客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq基础上加1,从而完成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)
其中:FIN标志位数置1,表示断开TCP连接。