目录
一、TCP基本特点
1.有连接
2.可靠传输
3.面向字节流
二、TCP 的核心特性
1.确认应答。
序号和确认序号的含义:
- 序号:每个字节都有一个自己的编号【虽然每一个报文里面都有确认序号这四个字节,但是并不是说随便一个报文,这里的序号都有意义,只有ACK的状态为为1的时候,序号才是有意义的】
- 确认序号:表示该序号之前的数据都已经确认收到了
2.超时重传
消息由发送方发送了之后,隔了好长时间都没有收到响应,大概率是丢包了。发送方无法区分是数据报丢了,还是 ack 丢了,此时会触发重传机制。
- 发送的请求丢了,此时重传即可
- 接收方发送的响应丢了,此时重传意味着接收方会收到相同的数据,TCP会在内部进行数据去重
- 超时时间的策略:Linux 超时以500ms为单位进行控制,每次判定超时重发的超时时间间隔都是500ms的整数倍。
- 数据报去重,以序号为key进行去重,保证应用层读到的数据不是重复数据
3.连接管理
a)建立连接,三次挥手
b)断开连接,四次挥手
(1)为什么要建立连接
- 要让通信双方分别验证各自的发送能力和接受能力是否正常
- 协商一些参数
(2)建立连接具体过程:
双方各自向对方发送SYN,再各自向对方发送ACK,中间的ACK 和SYN合并在一起了
重要的 TCP 状态
1.LISTEN : 服务器启动完毕,随时可以有客户端建立连接
2.ESTABLISHED : 连接建立成功,随时可以传输消息
断开连接的过程
双方各自向对方发送 FIN,再各自向对方发送ACK,之间的ACK 和 FIN 不一定能合并在一起
时机不同
重要的TCP 状态:
1.CLOSE_WAIT :四次挥手挥了一半了,如果服务器出现大量的CLOSE_WAIT,说明代码有 bug,没有及时关闭
2.TIME_WAIT : 主动断开连接的以访,会进入 TIME_WAIT,哪怕进程已经消亡,TIME_WAIT 状态还是会持续一会,防止 出现最后一个ACK丢包的情况,避免无法重传
等待时间:2MSL
三次握手
握手两次行不行?不行,此时主机B无法验证自己的发送能力和对方的接收能力
握手四次行不行?行,但是没必要,中间的 ACK 和 SYN 没必要拆开,合并在一起效率更高
四次挥手
挥手三次行不行?行,有可能的,捎带应答