目录
2,ACK:确认帧,占一个bit,只有0,1两个可能,0表示接受方没有收到数据,1表示接收方收到了数据
3,ASN:确认序列号:接收方发送确认序列号ASN,ASN填写内容是接收下一次想要接收的内容,一般是上次接收数据的尾地址+1,
4,源端口与目的端口:各占2个字节,8位,表示发送方和接收方的进程端口
5,同步序列号:SYN,只有1位,置为1时,表示具备同步功能,为0表示不具备同步功能
6,FIN:挥手标志位:主动挥手方,被动挥手方,双方同时挥手。
7,RST:reset segment 长期无法通信,就会将RST置为1,表示异常
现象:服务器上出现大量的TIME_WAIT状态的TCP连接,是否合理?
一,TCP概念
TCP:Transaction Control Protocol,传入控制协议
TCP是可靠的,面向连接的,面向字节流的传输层协议。不保证安全性。
可靠的:tcp协议会尽可能的保证数据传输的可靠性,保证发送方发送什么数据,接收方就接收到什么,如果在传输过程中,出现了数据的丢失,乱序或重复,tcp协议会将错误信息返回给发送方,再次请求发送出现储物的数据。
面向字节流:tcp会将应用层传输的数据,转换成字节流,将数据报转换成若干个分组,进行数据的传输。
面向连接的:tcp协议在进行进程间通信时,需要建立连接,经历三次握手,建立连接后,才会发送数据。
——————————————————————————————————————————
二,可靠传输:
发送方发送什么接收方就接收什么,就是可靠传输。
TCP可靠性:TCP尽可能保证可靠传输,不一定能够达到100%可靠传输。如果在发送数据时,出现传输错误,会将错误信息返回给发送方。
———————————————————————————————————————————
TCP可靠传输的原因:
需要建立连接、确认应答机制,超时重传机制,重复信息丢失机制,流量控制机制(保证了发送方的发送速度跟接收方的接收速度一致),校验和(将发送的数据hash函数值保存在协议头,接收方接收到数据时,会计算接收的数据的hash值与检验和是否相等),拥塞控制
1,流量控制
流量控制机制:tcp会根据接收方的接受速率和网络的承载能力,动态的调整发送速率,确保发送缓冲区不会过载,保证达到率
狭义:根据接收方的接收能力来调节(流量控制)
1),如何知道对方的接受能力?
接收方会将自己的接受能力填入header 中,告诉发送方。
将自己得接收能力填写道header中,所有得要发送得segment都携带该数据,即使没有数据要发,也会在一定时间内发送一些无用得消息,告诉对方自己得接受能力
接受能力:接收缓冲区大小 - 以占用接收缓冲区的大小
2),发送流量 = 接收方最大接收能力
3),通过什么机制来控制:滑动窗口机制
广义:根据网络的承载能力(拥塞控制)
1),发送方如何知道网络承载能力
通过拥塞算法,计算承载能力
常见的拥塞算法:
丢包率:重发的包 / 总发送的包 单位时间内
2),发送最大流量 = f(最大承载能力,滑动窗口大小)
3)如何实行发送流量控制 —— 滑动窗口机制
数据分段
TCP会将数据报化成成不同的分组,并对每个分组进行编号,保证数据到达接收方的顺序是正确的。
发送数据编号:
1),发送的数据编号——序列号:SN
确认的数据编号——确认序列号:ASN
发送数据的起始编号——初始化序列号:ISN
ISN不设置成0,保证安全,如果ISN设置位0,会很容易被恶意用户推算出来发送的数据报的地址,被恶意用户伪造,因此采用随机值,避免这种情况。一般来说ISN的区间在TCP : [ SN - 1000 SN SN+ 1000 ]之间。
2),编号的规则:
起始位置+偏移量,(比如将分组的首字母作为标号)
分组(segment):
segment = header + payload 表示一个分组的内容
2,tcp的确认应答与超时重传机制
1,超时重传的原因:
1),发送的数据丢失或出错
如果长时间没有收到接收方的ACK,就会在一定时间后,再次发送该数据
2),确认帧丢失
当确认帧丢失时,发送方会再次发送数据,接收方因为已经接收到了该数据,就不会在次接收该数据,并且会恢复一个确认帧给发送方,表示该数据我已经拿到了。
2,超时时间的设置:
超时时间一般设置为稍微大于2RTT,稍微大于两倍的往返传播时延。
但是在现实中,tcp无法知道未发送之前RTT为多少,因此现实中,存在两种解决办法
1),将地球上最远的两个地方的RTT设置为RTT,一般会设置为1、2min
2),实时计算RTT(还未投入到应用)
一版来说,一开始超时时间会设置的较短一点,出现ack丢失以后,就会适当的把超时时间拉长。
tcp重传机制的次数
1),如果发送几次任然未收到确认帧,就会停止发送该数据,并向应用层发送异常,停止发送。
2),再次进自己的最大努力,再次建立连接,发送数据(会发送reset segment)
(TCP发送的数据需要保存,用来在超时时,进行重传,因此tcp发送方需要又发送缓冲区,接收方也需要有接收缓冲区)
划分分组(报文段)阶段:
建立连接阶段:
传输数据阶段:
TCP的职责
1),对于tcp上的每一条信道,tcp要维护:ISN(初识序列号),SN(序列号),ASN(已接受的序列号),发送缓冲区,接收缓冲区,五元组信息(双方的IP ,PORT + tcp协议信息)。
2),tcp保证可靠性,需要和通信双方建立同步(Synchronized)机制,建立可靠连接。
————————————————————————————
三,三次握手
三次握手的状态
为什么要有状态?及三次握手的状态转移
通过状态,TCP才知道每条连接的处于何种情况
———————————————————————————————————————————
四,TCP协议头解析(20字节)
1,序号SN:指的是发送方发送数据的首地址+数据的长度
2,ACK:确认帧,占一个bit,只有0,1两个可能,0表示接受方没有收到数据,1表示接收方收到了数据
3,ASN:确认序列号:接收方发送确认序列号ASN,ASN填写内容是接收下一次想要接收的内容,一般是上次接收数据的尾地址+1,
ASN只有在ACK为1时才有效,ACK为1表示收到了数据,才会发送ASN
4,源端口与目的端口:各占2个字节,8位,表示发送方和接收方的进程端口
5,同步序列号:SYN,只有1位,置为1时,表示具备同步功能,为0表示不具备同步功能
同携带数据的问题:
1,第一次SYN不能携带数据,第二次SYN + ACK 不能携带数据,因为此时还不知道连接是否建立成功,第三次ACK时,可以携带数据,因为此时连接已经建立成功了,
6,FIN:挥手标志位:主动挥手方,被动挥手方,双方同时挥手。
7,RST:reset segment 长期无法通信,就会将RST置为1,表示异常
发送reset segment就会断开连接,收到RST,就立即断开,不进行四次挥手
8,16位窗口:窗口大小对应得是接收数据得能力
将自己得接收能力填写道header中,所有得要发送得segment都携带该数据,即使没有数据要发,也会在一定时间内发送一些无用得消息,告诉对方自己得接受能力
接受能力:接收缓冲区大小 - 以占用接收缓冲区的大小
9,校验和,可靠传输的保证机制
发送的数据会将自己校验码存储在协议头中,接收方接收道数据后就会计算接收的数据的校验码和校验和是否一致,从而保证可靠传输。
10,push:加急位
对需要紧急处理的数据做加加急处理。
Wireshark抓包演示:
0X8 =》 8 ,8 * 4 = 32 字节。
五,四次挥手
挥手标志位:FIN
三种挥手可能
主动挥手方:主动断开连接的一方,可以是客户端或者是服务器
被动挥手方:被动断开连接的一方,
同时关闭:双方都是主动挥手方
四次挥手标志位变化:
四次挥手可以不合并,所以是三次握手,四次挥手
1),正常的四次挥手:
2),变形的三次挥手和同时关闭
CLOSE_WAIT状态发生在被动方:主动挥手方发送FIN,此时被动方收到FIN,进入短暂的CLOSE_WAIT,发送ACK,被动方在发送FIN后进入LAST_ACK等待主动方的ACK到达以后进入CLOSED状态。
服务器出现大量的CLOSE_WAIT是否合理?
合理:不确定
服务器出现大量的CLOSE_WAIT,如果在程序设计时,将CLOSED_WAIT道LAST_ACK中间设置了较长的反应时间,那么就是合理,否则就是不合理的。
TIME_WAIT状态:
发生在主动挥手方;
同时还会对这条连接信道上的一些资源进行回收。
为什么TIME_WAIT的时间是2MSL?
MSL:一个Segment能够在网络上存活的最大时间。
将TIME_WAIT设置为2MSL,则一个往返的最大存活时间,一定能够保证最后一个ACK到达对方,如果没有到达对方说明网络存在问题,对方再次发送fin我们也不会收到。
——————————————————————————————————————————
现象:服务器上出现大量的TIME_WAIT状态的TCP连接,是否合理?
所以在网络设计时,不建议服务器主动关闭连接。(特殊情况下,服务器也会主动关闭)
六,TCP连接管理的异常情况
1,一个进程被强行关闭:
TCP是操作系统提供的机制,因为进程的资源都是OS分配的,即使强制结束了进程,OS会调用close,进行正常的四次挥手,对资源进行回收。双方都可以正常关闭。
2,关闭计算机:
OS会在关机之前,释放掉所有的连接,双方进程的连接都是正常的四次挥手
只有OS还能正常执行,就会正常四次挥手,关闭资源
3,断电:
此时OS无法正常运行,进程之间的资源OS无法关闭,连接属于对象,存储在内存中,内存中的数据断电即失,断电方的连接会直接消失。
而未断电的一方,如果长期收不到对方的应答,就会发送最后一条reset segment主动和对方断开连接,抛出异常;
如果为断电方一直是读操作,就会一直处在Establelish状态,
1,此时TCP就会启动keepalive状态,发送一些无用segment,确保对方存活,但是tcp的keepalive机制,会隔很久才会发送一次,并且是全部连接都会发送,不采用。
2,一般采用应用层的机制
read的时候,不要无限制的read,而是带上一个超时时间(read timeout),定期主动的进行通信,即心跳包(heartbeat包)。
总结:
主要协议: