文章目录
UDP
概念
用户数据协议 UDP(User Datagram Protocol),提供无连接的数据传输服务。
应用场景
即时通信,比如: 语音、视频 、直播等
TCP
概念
传输控制协议 TCP(Transmission Control Protocol),提供面向连接的,可靠的数据传输服务。
应用场景
文件传输、发送和接收邮件、远程登录等
三次握手
过程
为什么要进行“三次”握手?
因为两次握手只能保证单向连接是畅通的。只有经过第三次握手,才能确保双向都可以接收到对方的发送的数据。
第二次传回了 ACK,为什么还要传回 SYN?
服务端传回 ACK 是为了告诉客户端,接收到的信息确实就是客户端所发送的信号,这表明从客户端到服务端的通信是正常的,而回传 SYN 则是为了建立并确认从服务端到客户端的通信。
四次挥手
过程
为什么要进行“四次”挥手?
因为要确保服务端和客户端都停止发送数据。
为什么最后一次需等待2MSL(TIME_WAIT)?
MSL:最大分段寿命,表示一个 TCP 分段可以存在于互联网系统中的最大时间。
1、保证客户端发的报文到达服务端且若失败可重发。
2、确保所有旧数据消失,新的连接中不会存在旧的请求。
为什么会出现大量 CLOSE_WAIT 的现象?
在对方已经发送 FIN 后,由于服务器自己及时没有发送 ACK 确认,程序无法检测关闭,此时一直保持连接状态无法关闭,因此出现 close_wait 。
解决:检测出对方已经关闭的 socket 并关闭。
1、代码需要判断 socket,一旦读到 0,就断开连接,read返回负,检查一下error,如果不是AGAIN,就断开连接。
2、给每个 socket 添加一个时间戳,定期检查所有时间戳,如果时间戳与当前时间的差值超过一定阈值,即关闭此连接。
TCP 和 UDP 的区别
协议 | 是否可靠 | 是否面向连接 | 传输效率 | 传输形式 | 通信 | 首部字节 |
---|---|---|---|---|---|---|
TCP | 是 | 是 | 慢 | 字节流 | 一对一 | 20字节 |
UDP | 否 | 否 | 快 | 报文 | 各种形式 | 8字节 |
为什么 TCP 是面向连接的?
因为 TCP 在数据传输之前会先建立连接,即三次握手。
为什么 TCP 是可靠的?
1、校验和: TCP 的检验和是为了检测数据在传输过程中的任何变化。如果检验和有差错,TCP 将丢弃这个报文段。
2、TCP 的接收端会丢弃重复数据。
3、流量控制: TCP 的接收端只允许发送端发送缓冲区能接纳的数据,防止丢包。(TCP 利用滑动窗口实现流量控制)
4、拥塞控制: 当网络拥塞时,减少数据的发送。
5、ARQ(自动重发请求)协议: 每发完一个分组就停止发送,等待对方确认,在收到确认后再发下一个分组。
6、超时重传: 当 TCP 发出一个段后,它会启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
如何使 UDP 做到可靠传输?
在应用层模仿传输层 TCP 的可靠传输性。
1、添加 seq/ack 机制,确保数据发送到端。
2、添加发送和接收缓冲区。
3、添加超时重传机制。
参考文章:https://blog.youkuaiyun.com/meism5/article/details/90414236