TCP与UDP协议(三次握手四次挥手)

news/2024/10/8 7:15:21 标签: tcp/ip, udp

TCP与UDP

  • 简介TCP和UDP
  • 一、TCP
    • 1.1 TCP的三次握手
      • 问题来了:为啥是三次握手而不是两次呢?
    • 1.2建立连接后的通信过程(丢包与乱序问题)
    • 1.3四次挥手
      • 问题来了:为什么要四次挥手?
  • 二、UDP

简介TCP和UDP

TCP、UDP都属于传输层,是传输协议
TCP基于连接,UDP基于非连接
TCP:在不稳定的信道上建立稳定的连接
在这里插入图片描述
UDP(写信):是不可靠通信,邮件发出后无法判断对方是否接收到,内容是否完整,顺序是否正常等等。
TCP(打电话):可靠的通信,必须对方接通才可以互相对话,到最后挂断。

一、TCP

1.1 TCP的三次握手

在这里插入图片描述
建立连接的过程:

  1. 当客户端向服务端发起连接时,会先发一包syn包连接请求数据,进行询问,能否建立连接。
  2. 如果服务端同意连接,则回复一包syn+ack包。
  3. 客户端收到之后回复一包ack包,连接建立

举个例子:(假设客户端为A,服务端为B)
A:是B吗?我要和你说个事,听得到吗?
B:好的,你听到我说话吗?
A:我也听得到。

问题来了:为啥是三次握手而不是两次呢?

本质是为了互相确认对方的序列号。
大家也可以想想如果是前两次握手就建立了链接,无需A再次发送ack给B,其实B这边无法知道A是否可以接受信息的。第一次握手表示A可以发出信息,第二次则表示B可以接收消息和发消息。所以必须要求第三次握手,确保在不可靠的通信中实现可靠的通信。
举个握手两次翻车的例子: 例如A第一次发送syc1包,出现网络波动导致滞留,A再次发送syc2包,正常建立连接,这个时候网络正常,syc1包发送到B,B误以为建立新的连接,导致B这边以为有两个连接,而A这边只有一个连接,导致最终状态不一致。(如果这个时候有第三次A确认,就不会出现这个情况了)

1.2建立连接后的通信过程(丢包与乱序问题)

在这里插入图片描述
首先有一个发送缓冲区,数据序列是从0开始递增,A发送给B的报文中有起始序列号和长度以及内容,B接收到后会发送一个ACK就是刚刚发送的序列号加长度,确保数据不丢包,如果不一致,B可以则根据实际收到的计算丢失的序列号起点要求A重发即可。

1.3四次挥手

在这里插入图片描述
过程描述:

  1. A需要向服务端发起一包fin包,表示要关闭连接,自己进入终止等待1状态,这是第一次挥手。
  2. B 收到fin包,发送一包ack包,表示自己进入了关闭等待状态,客户端进入终止等待2状态,这是第二次挥手
  3. B此时还可以发送未发送的数据,而客户端还可以接收数据,待服务端发送完数据之后,发送一包fin包,进入最后确认状态。这是第三次挥手。
  4. A收到之后回复ack包,进入超时等待状态,经过超时时间后关闭连接,而服务端收到ack包后,立即关闭连接。这是第四次挥手

举个生活中的例子:
A:打完球了吗,饭做好了。
B:知道了,最后一个回家球!
B:进了,回家的路上。
A:OK。

问题来了:为什么要四次挥手?

由于 TCP 的半关闭(half-close)特性,任何一方都可以在数据传送结束后,发出连接关闭的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接关闭通知,对方确认后就完全关闭了TCP连接。
通俗的来说,两次挥手就可以释放一端到另一端的 TCP 连接,完全释放连接一共需要四次挥手。

二、UDP

在这里插入图片描述
特点:

  • 建立于非链接,将数据包封装一下,即可发出
  • 性能损耗少,CPU、内存占用远小于TCP,稳定性弱于TCP
  • TCP适合传输文件、发送文件、浏览网页,UDP适合域名查询、语音通话、视频,以及隧道网络:VPN等

举个例子:
在这里插入图片描述
左边兄弟把盘子中的韭菜扔出去了就不管了,不管对方是否接收到,韭菜是否散了等等。

此文章是基于B站视频而记录
视频地址:视频讲解更清晰


http://www.niftyadmin.cn/n/5693762.html

相关文章

C++版iwanna1

第一篇目录 开头程序Game.cpp源文件Player.h头文件Player.cpp源文件trigger.h头文件trigger.cpp源文件Cmp.h头文件Cmp.cpp源文件 开头 大家好&#xff0c;我叫这是我58。 程序 Game.cpp源文件 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <c…

《重生到现代之从零开始的数据结构生活》—— 复杂度

前言 进入代码世界已经有一阵了&#xff0c;C语言学的差不多了打算看看数据结构 以前都没想过我能学到这嘞哈哈哈哈 所以&#xff0c;《重生到现代之从零开始的数据结构生活》开始啦 数据结构 我们天天说数据结构怎么怎么了&#xff0c;那什么是数据结构你知道吗 数据结构…

[C++] 小游戏 征伐 SLG DNF 0.0.2 版本 zty出品

目录 大家好~ 今天zty带来的是 War and Expedition SLG DNF 0.0.2 version 讲人话就是 War and Expedition &#xff08;游戏名&#xff0c;即征伐&#xff09; SLG &#xff08;即时战略类游戏&#xff09; DNF &#xff08;Did Not Finish&#xff09; 0.0.2 &#xff…

利用Python输入n个用空格分隔的整数 ← list(map(int,input().split()))

在算法设计中&#xff0c;经常需要输入 n 个用空格分隔的整数。现对其 Python 代码进行总结&#xff1a; ● 当 n1 时&#xff1a; xint(input()) print(x) ● 当 n2 时&#xff1a; x,ymap(int,input().split()) #Enter numbers separated by space sumxy print(sum) in: 1…

【Docker】04-Docker部署Java后端

1. 运行MySQL镜像 hm.cnf [client] default_character_setutf8mb4 [mysql] default_character_setutf8mb4 [mysqld] character_set_serverutf8mb4 collation_serverutf8mb4_unicode_ci init_connectSET NAMES utf8mb4运行MySQL镜像 docker run -d --name mysql -p 3307:3306…

swift使用internvl2微调ocr文字检测(目标检测)

详细记录swfit微调interVL2-8B多模态大模型进行目标检测(附代码)-CSDN博客文章浏览阅读2k次,点赞45次,收藏14次。目标检测任务已经不是一个新鲜事了,但是多模态大模型作目标检测任务并不多见,本文详细记录swfit微调interVL2-8B多模态大模型进行目标检测的过程,旨在让更多…

Notepad++ 怎么让行行之间只保留一空行

在 Notepad 中&#xff0c;您可以使用正则表达式查找和替换功能来实现您的需求。以下是步骤和相应的正则表达式&#xff1a; 一、打开您的文本文件。 二、按下 Ctrl H 快捷键打开查找和替换对话框。 三、在“查找模式”部分&#xff0c;选择“正则表达式”选项。 四、输入…

Steam Deck掌机可装“黑苹果” 开发者成功安装macOS 15 Sequoia

在Steam Deck掌机上运行Windows 11相对轻松&#xff0c;但要让其成功搭载“黑苹果”系统则颇具挑战性。近日&#xff0c;有博主勇于尝试&#xff0c;将macOS 15 Sequoia安装到了Steam Deck上。 开发者kaitlyn在X平台上分享道&#xff1a;“在朋友们的鼎力相助下&#xff0c;我…