如何理解
TCP(Transmission Control Protocol): 传输控制协议
UPD(User Datagram Protocol): 用户数据协议
- TCP 是基于链接的, UDP 是基于非链接的
- 如果把计算机的通信比喻为人的通信, 人的通信有 2 种方式, 写信和打电话, 这里不考虑速度因素
- UDP 就像写信, 写出去的信不不能保证对方一定收到, 及时对方收到了也不能保证信件一定完整, 即使信件完整也不能保证接受信的顺序和发送信的顺序一致, 甚至对方的收信地址可能是不存在的你也不知道
- TCP 就像打电话, 从拨通电话, 到控制通话, 到挂断电话都能有及时的反馈
三次握手建立连接
四次回收断开连接 FIN
三次握手
- A:发送 syn 包
- B:返回 syn + ack
- A: 发送 ack
为什么要 3 次握手
如果是 2 次握手的话客户端发送 syn1 阻塞,
客户端重新发送 syn2 成功, 服务端返回 syn2 + ack 建立连接
客户端发送的 syn1 阻塞结束, 服务端收到 syn1 返回 syn1 + ack
服务端以为建立了 2 个连接 , 客户端只建立了一个连接, 造成了状态的不一致
通话控制
- 丢包问题
- 乱序问题
- 发送缓冲区
- 发送报文: 序列号 + 长度 + 数据内容
- 回复确认:的 ack 就是序列号 + 长度 = 下一个包的起始位置
- 切割发送: 根据序列号和长度重组数据
- 丢失重发: 接收端序列号丢失就很容易发现, 重新发送即可
hello
发送端: 发送数据 0 | 2 | he , 2 | 2 | ll , 4|1|o
接收端: 回复 ack 0 | 2
- 接收端通过 ack 回复接收,
- 发送端通过回复 ack 重发数据
四次挥手
A: 发送 fin 包
B: 回答 ack 包
B: 回答 fin 包
A: 回答 ack 包
A: 超时等待保证 B 收到最后的 ack 包,因为 B 没收到会重新发送 fin 包刷新超时时间
超时等待
因为没有保证 B 最后一定能收到 A 发送的 ack 包, 如果 B 超时没有收到 B 会重新发送 fin 包, A 刷新超时时间并且重新发送最后的 ack 包.
refrence
上面的仅仅是个人总结和理解, 参考如下.
一条视频讲清楚TCP协议与UDP协议-什么是三次握手与四次挥手_哔哩哔哩_bilibili