TCP和UDP 的区别,TCP/UDP协议相关子协议,为什么要使用三次握手,为什么要四次挥手,TIME_WAIT的意义,为什么是2MSL,拥塞控制,流量控制,超时重传

本文深入探讨了TCP与UDP两种协议的特点及应用场景,解释了TCP为何采用三次握手建立连接,UDP为何不可靠,以及TCP如何确保数据传输的可靠性等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么TCP需要握手,能不能不握手?

在这里插入图片描述
我们先对比一下UDP和TCP的通信流程,可以发现,在UDP协议中,是没有握手这一个操作的。
我们通常说TCP是可靠通信协议,而UDP是不可靠通信协议。

  • TCP可靠性的含义:接收方收到的数据是完整,有序,无差错的。
  • UDP不可靠的含义:接收方接收到的数据可能存在部分丢失,顺序也不一定能保证。

** UDP和TCP都是基于同样的互联网基础设施,且都基于IP协议实现,为什么TCP可以实现可靠传输,而UDP不行?**

  1. TCP实现可靠数据传输原理

    每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区。TCP协议要求对端接收到TCP数据报之后,要对其序列号进行ACK,只有当接收到一个TCP数据包的ACK之后,才可以把这个TCP数据报从socket的发送缓冲区清除。
    另外TCP还有一个流量控制功能,TCP的socket接收缓冲区接收到网络上来的数据缓存起来后,如果应用程序一直没有读取,socket接收缓冲区满了之后,发生的动作是:通知对端TCP协议中的窗口关闭,这便是滑动窗口的实现,保证TCP socket 接收缓冲区不会溢出,因为对方不允许发送超过所通知窗口大小的数据,这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接收方TCP将丢弃它。这两点保证了TCP是可靠性传输的。

  2. UDP不可靠传输原理

UDP只有一个socket接收缓存区,没有socket发送缓冲区,即只要有数据就发,不管对方是否可以正确接收。而在对方的socket接收缓冲区满了之后,新来的数据报无法进入到socket接收缓冲区,此数据报就会被丢弃,UDP是没有流量控制的,故UDP是不可靠的。

TCP和UDP的区别:

  1. TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。
  2. TCP提供可靠服务(将数据截断为合理长度,超时重传,应答机制,差错检验,失序重新排序,丢弃重复数据,流量控制<流量控制协议是可变大小的滑动窗口协议>)。
    UDP尽最大的努力交付,即不保证可靠交付。
  3. UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高要求的通信或广播通信。
  4. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
  5. TCP对系统资源要求较多,UDP对系统资源要求较少。
  6. TCP的传输单位称为TCP报文段,UDP传输单位称为用户数据段。

TCP协议的几个状态

  • SYN表示建立连接。
  • FIN表示关闭连接。
  • ACK表示响应
  • PSH表示有数据传输
  • RST表示连接重置

TCP的滑动窗口协议

该协议用于网络数据传输时的流量控制,以避免拥塞的发生。协议允许发送方在停止并等待确认前发送多个数据分组,由于发送方不必每发一个组就停下来等待确认,因此该协议可以加速数据传输,提高网络吞吐量。

超时重传机制

超时重传是指,发送数据包的一端在一定的时间周期内没有收到相应的ACK,等待一段时间,超时之后就认为这个数据包丢失,就会重新发送。

拥塞控制和流量控制的区别

流量控制是,端到端的控制,一端发送数据太快,另一端来不及接收,一般通过滑动窗口的大小的改变来实现。
拥塞控制,是一端到另外一端之间的网络发生堵塞导致传输过慢或者丢包,来不及传输。拥塞控制是一个全局性的过程,涉及到所有的主机,路由器,以及降低网络性能的所有因素。

TCP相关协议端口号

  • FTP:文件传输协议,22
  • Telent:远程登录协议,23
  • SMTP:邮件传输协议,发送邮件,服务器开放端口25
  • POP3:接收邮件,端口号110

UDP相关协议端口号

  • DNS:用于域名解析,端口53
  • SNMP:简单网络管理协议,端口161
  • TFTP:简单文件传输协议。端口69

为什么使用三次握手,两次握手不行吗?

在这里插入图片描述
两次握手不可以,
原因:

  1. 防止已经失效的连接请求又传送到服务器端,从而导致不必要的错误和资源的浪费。

    举例:
    如果使用的是两次握手,假设有这样一种场景,客户端发送的一个请求连接以为在网络中滞留的时间太长了,导致客户端迟迟没有收到确认报文,以为服务端没有收到,此时重新发送这条报文,然后客户端与服务器经过两次握手,成功建立连接完成数据传输。之前发送的失效的连接请求因为网络畅通了,到达了服务器,服务器以为是客户端需要建立连接,所以经过两次握手,直接进入ESTABLISHEN(已建立)阶段,服务端会一直等待客户端发送数据,造成资源的浪费。
    如果使用的是三次握手,就算失效的报文传送过来了,服务器接收到了那条失效的报文并且回复了确认报文,但是客户端不会再发出确认,由于服务器收不到确认,所以就知道客户端没有发送连接请求,就不会再继续等待。

  2. 两次握手只能保证单向连接是畅通的。而TCP是一个双向传输协议,只有经过三次握手,才能保证双方都可以接收到对方发送的数据。

举例说明:

为什么要四次挥手?

在这里插入图片描述
前两次挥手断开一个方向的连接,后两个挥手断开另一个方向的连接。(TCP是全双工通信)

为什么需要TIME_WAIT?

为了保证服务器可以收到客户端的确认应答。
主动关闭端在TIME_WAIT状态后,等两倍MSL(报文最大生命周期)时间之后将状态改为CLOSED以关闭连接。
如果没有TIME_WAIT,客户端在发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,服务端等待超时后会重新发送连接释放请求,但此时客户端已经关闭了,不会做出任何响应,因此服务端永远无法正常关闭。

为什么是2MSL?

MSL是TCP报文的最大生命周期,因为TIME_WAIT持续在2MSL就可以保证在两个传输方向上的尚未接收到或者迟到的报文段已经消失,否则服务器立即重启,可能会收到来自上一个进程迟到的数据,但是这种数据很可能是错误的,同时也是在理论上保证最后一个报文可靠到达,假设最后一个ACK丢失,那么服务器会再重发一个FIN,这是虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值