TCP八大特性(前四种)
ACK 消息确认应答
一般情况下:客户端会发送信息给服务器端,后服务器端会给出相应的回复(ACK)。
消息头发送信息:
ACK消息:
意外情况:客户端信息发送失败
超时重传
超时时间应该设置多少?
超时时间是根据不同操作系统是不一样的,不同的操作系统有不同的时长。
Linux默认超时时间是:500ms。
发送的频率和发送的次数?
发送的时长是动态改变的,每次成倍的改变。
第一次:500ms
第二次:1000ms
第三次:2000ms
超时一定重试次数之后,就会认为服务器端下线,端口连接。
连接管理机制
建立连接(三次握手)
简单的来叙述的话(连接过程):
客户端:第一次发送的消息之后(我要连接你了)
服务器端:好的,你练吧
客户端:那我就连接了。
此后就正式交互
三次通讯:
第一次通讯:验证了服务器端的接受能力,客户端的发送能力。
第二次通讯:验证了客户端的发送能力。
第三次通讯:验证了服务器端的发送能力。
补充:
TCP 能不能进行2次握手?
不能
TCP能不能进行4次握手?
可以,但没必要。
断开连接(四次挥手)
四次挥手:
第一次挥手:客户端发送断开连接的请求。
第二次挥手:服务器端接收到请求,并进行相应的处理之后就会进行断开连接。(内核实现的)
第三次挥手:服务器端把相应的处理完成了,断开连接吧。(应用层的任务)
第四次挥手:客户端接收到信息,并进行断开连接。
四次挥手存在的问题之一:CLOSE_WAIT
没有主动调用close(),导致后面的挥手没有触发。
问题二:第四次挥手,能不能直接将客户端的TIME_WAIT变成CLOSE?
答案:不行
TIME_WAIT转换成CLOSED最大的等待时间是多少?
1000ms
滑动窗口
加快消息的传输
1、窗口大小指的是无需等待确认应答而可以继续发送数据的最大值. 上图的窗口大小就是4000个字节(四个段).
2、发送前四个段的时候, 不需要等待任何ACK, 直接发送;
3、收到第一个ACK后, 滑动窗口向后移动, 继续发送第五个段的数据; 依次类推;
4、操作系统内核为了维护这个滑动窗口, 需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答; 只有确认应答过的数据, 才能从缓冲区删掉;
5、窗口越大, 则网络的吞吐率就越高;
存在的情况下如下:
情况一: 数据包已经抵达, ACK被丢了
这种情况下, 部分ACK丢了并不要紧, 因为可以通过后续的ACK进行确认;
情况二: 数据包就直接丢了.
1、当某一段报文段丢失之后, 发送端会一直收到 1001 这样的ACK, 就像是在提醒发送端 “我想要的是 1001”
一样;
2、如果发送端主机连续三次收到了同样一个 “1001” 这样的应答, 就会将对应的数据 1001 - 2000 重新发送;
3、这个时候接收端收到了 1001 之后, 再次返回的ACK就是7001了(因为2001 - 7000)接收端其实之前就已经收到了, 被放到了接收端操作系统内核的接收缓冲区中;
(下篇后四大特性)