| |
|
开发:
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报文格式一个UDP报文包含UDP报头和UDP数据载荷两个部分 其中数据载荷就是应用层数据 UDP报头则存储着8字节的信息:分别是源端口号,目的端口号,报文长度和校验和 其中源端口号就是操作系统给客户端自动分配的端口 目的端口就是服务器的端口 报文长度在UDP中只有两个字节,也就意味着只能表示0-64k的数据,如果有很长的数据,需要在应用层分包,再通过多个UDP数据报发送(所以一般用TCP) 校验和用于验证网络传输的这个数据是否正确,校验和即可以通过数据个数判断,也可以根据数据内容判断 UDP特点
无连接就是指只要知道端口号和IP就进行传输,不需要建立连接 不可靠表示发送方发送数据后,不知道接受方是否收到了这些数据 面向数据报是指UDP是以数据报格式传输的,也就是发送方发送一个100字节的数据,接受方必须只能一次就接受完这个100字节的数据 全双工就是指两人通信之间,双方可以同时接受或者发送消息,就如电话。区别于单工(广播)和半双工(对讲机) TCP报文格式TCP特点?
其中,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地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |