TCP三次握手、四次挥手及UDP详解

文章目录

  • UDP
    • 概念
    • 应用场景
  • TCP
    • 概念
    • 应用场景
    • 三次握手
      • 过程
      • 为什么要进行“三次”握手?
      • 第二次传回了 ACK,为什么还要传回 SYN?
    • 四次挥手
      • 过程
      • 为什么要进行“四次”挥手?
      • 为什么最后一次需等待2MSL(TIME_WAIT)?
      • 为什么会出现大量 CLOSE_WAIT 的现象?
  • TCP 和 UDP 的区别
      • 为什么 TCP 是面向连接的?
      • 为什么 TCP 是可靠的?
      • 如何使 UDP 做到可靠传输?


UDP

概念

用户数据协议 UDP(User Datagram Protocol),提供无连接的数据传输服务。

应用场景

即时通信,比如: 语音、视频 、直播等

TCP

概念

传输控制协议 TCP(Transmission Control Protocol),提供面向连接的,可靠的数据传输服务。

应用场景

文件传输、发送和接收邮件、远程登录等

三次握手

过程

TCP三次握手、四次挥手及UDP详解_第1张图片

为什么要进行“三次”握手?

因为两次握手只能保证单向连接是畅通的。只有经过第三次握手,才能确保双向都可以接收到对方的发送的数据。

第二次传回了 ACK,为什么还要传回 SYN?

服务端传回 ACK 是为了告诉客户端,接收到的信息确实就是客户端所发送的信号,这表明从客户端到服务端的通信是正常的,而回传 SYN 则是为了建立并确认从服务端到客户端的通信。

四次挥手

过程

TCP三次握手、四次挥手及UDP详解_第2张图片

为什么要进行“四次”挥手?

因为要确保服务端和客户端都停止发送数据。

为什么最后一次需等待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.csdn.net/meism5/article/details/90414236

你可能感兴趣的:(计算机网络,udp,tcpip,网络)