IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> TCP与UDP协议的那些事 -> 正文阅读

[网络协议]TCP与UDP协议的那些事

在传输层中,有两个很重要的协议:UDP和TCP

接下来我们先来聊一聊这两个协议

UDP

报文格式

一个UDP报文包含UDP报头和UDP数据载荷两个部分

其中数据载荷就是应用层数据

UDP报头则存储着8字节的信息:分别是源端口号目的端口号报文长度校验和

其中源端口号就是操作系统给客户端自动分配的端口

目的端口就是服务器的端口

报文长度在UDP中只有两个字节,也就意味着只能表示0-64k的数据,如果有很长的数据,需要在应用层分包,再通过多个UDP数据报发送(所以一般用TCP)

校验和用于验证网络传输的这个数据是否正确,校验和即可以通过数据个数判断,也可以根据数据内容判断

UDP特点

  1. 无连接
  2. 不可靠
  3. 面向数据报
  4. 全双工

无连接就是指只要知道端口号和IP就进行传输,不需要建立连接

不可靠表示发送方发送数据后,不知道接受方是否收到了这些数据

面向数据报是指UDP是以数据报格式传输的,也就是发送方发送一个100字节的数据,接受方必须只能一次就接受完这个100字节的数据

全双工就是指两人通信之间,双方可以同时接受或者发送消息,就如电话。区别于单工(广播)和半双工(对讲机)

TCP

报文格式

TCP特点?

  1. 有连接
  2. 可靠传输
  3. 面向字节流
  4. 全双工

其中,TCP最重要的机制就是可靠传输,即能够知道对方是否收到消息

那TCP是如何保证可靠传输的呢?

序号与确认序号

早年的通讯没这么发达,如果我给女神发短信,在不可靠传输下,可能会有很多种情况:

第一种情况

第二种情况?

?

?为了避免这种情况,TCP引入了序号与确认序号的机制,这样就不会搞混了:


这里还要注意,TCP针对消息的序号,不是按照“消息条数”来编号的,而是按照字节来编号的:

具体过程如下:

?A先给B发送了1000个字节

之后B会给A返回一个应答报文(ACK)会带有确认序号,叫做1001,也就是小于1001的数据已经被主机B收到了。(1-1000被层层封装为以太网数据帧进行传输)

接下来主机A就从1001再开始传输

超时重传

上面的确认应答是网络一切正常的时候,通过ACK通知发送方表明收到了

如果出现丢包的情况,那么这个时候就是超时重传的起作用时刻

第一种情况:发送方数据丢了

第二种情况:接受方数据丢了

?但是实际情况无法判断是哪种情况。

所以这里考虑最坏情况:对方没有收到

不过发送方会先有一个等待时间,如果超过了这个等待时间也没等到ACK,就会重发一次

这就是超时重传。


这里第二种情况我们还需要单独考虑一下:

如果ACK丢了,发送方的消息没丢,如果此时超时重传,会出现重复的消息

TCP的解决办法是在操作系统内核中创建一个接收缓冲区中

接受方收到的数据在进入这个缓冲区前,会先判断缓冲区中是否存在过这个数据

如果存在过直接丢弃,否则就放进来。


最后注意:

但是如果网络收到了严重的波动,它也不会一直重传下去,会自动断开TCP连接。

重传的时间间隔也不是一成不变的,一般会逐渐加大,也就是重传频率会降低。

连接管理

注意, 这块知识是重点

如何建立连接(三次握手)

客户端和服务器之间,通过三次交互,完成了建立连接的过程。?

?

?客户端先发送一个SYN,SYN为1表示当前报文是一个“同步报文段”,开始请求建立连接。

之后服务端会发送ACK,表示收到回应,再发出SYN表示正式建立连接。

注意,这里服务器端发送的SYN和ACK是同时发送的。

最后客户端收到,发送ACK表示确认。


那么三次握手如何保证TCP连接的可靠性呢?

三次握手相当于“投石问路”,检查一下网络是否满足可靠传输的基本条件。

如果三次握手成功,就证明了通信双方网络正常,可以进行后续的传输。

就如下面的情景:

?

如何断开连接(四次挥手)

建立好连接后,操作系统内核中会用数据结构来保存信息

这个信息叫做五元组,即源IP,源端口,目的IP,目的端口,TCP

保存了信息就占据了一定内存,在断开连接后要释放这一块内存,就需要四次“挥手”

发送方(这里可能是客户端,也可能是服务器)先发送FIN,表示要结束了

接受方返回确认信息ACK,也返回FIN表示结束

接受方返回ACK确认

注意,这里中间的ACK和FIN是不能合并的,因为他们不是同时发送的(以为这里的ACK是内核发送的,FIN是用户代码负责的)


?

最后,这里每次都传输都会有一个状态

其中,CLOSE_WAIT表示四次挥手挥了两次后的状态,这个状态是在等待代码调用close方法

TIME_WAIT表示发送方接受FIN后,不立即释放资源,会等待一段时间再释放

因为如果立即释放,如果最后一次ACK丢包了,接受方会超时重传,再发送FIN

如果接受方已经释放资源,就不会再收到这个FIN了

最多等待时间为2MSL,即网络上任意两点间传输需要的最大时间(可以配置的)

???

谢谢你能看到这ヽ( ̄ω ̄( ̄ω ̄〃)ゝ

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 09:03:26  更:2022-04-30 09:03:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 3:56:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码