首页 > 编程学习 > TCP三次握手、四次挥手及UDP详解

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

发布时间:2022/5/14 15:42:24

文章目录

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


UDP

概念

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

应用场景

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

TCP

概念

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

应用场景

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

三次握手

过程

三次握手

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

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

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

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

四次挥手

过程

四次挥手

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

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

为什么最后一次需等待2MSL(TIME_WAIT)?

MSL:最大分段寿命,表示一个 TCP 分段可以存在于互联网系统中的最大时间。

1、保证客户端发的报文到达服务端且若失败可重发
2、确保所有旧数据消失,新的连接中不会存在旧的请求

为什么会出现大量 CLOSE_WAIT 的现象?

在被动关闭连接情况下,在已经接收到 FIN,但是还没有发送自己的 FIN 的时候,连接处于 CLOSE_WAIT 状态。出现大量 CLOSE_WAIT 的现象,主要原因是某种情况下对方关闭了 socket 链接,但是我方忙于读或者写,没有关闭连接。
解决:检测出对方已经关闭的 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

Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000