| |
|
开发:
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的16位最大长度,也就是说UDP共计(首部+数据)一共64k。比较小,假如传输的数据超过64k 基于UDP的应用层协议NFS:网络文件系统 TCP协议特点
协议格式
和UDP相比没有数据总长度,只有首部长度,是因为他不需要总长。 怎么将报头,有效载荷分离? 32位序号发送端------>接收端 确认序号接收端----->发送端 连续发送了3个报文,我就要给你3个应答,假如3个应答都丢了呢?
他们两个与确认应答机制相关。 16位窗口大小TCP既有接收缓冲区,又有发送缓冲区。而16位窗口大小是接收缓冲区剩余的大小。谁发这个报文,谁填写 即告诉你我的接收能力,让你心里有数。 标志位1表示被设置 RST标志位跳转到的地方 但是服务器没有收到。假如客户端直接开始发数据,服务器傻眼了,建立链接才进行了两次握手,你就要和我传数据。服务器会觉得任务客户端出现异常,然后就会向他发送RST标志位,使客户端重新准备三次握手。 URG标志位TCP要保证按序到达,就像我们排队,先来就在前面。但有特殊情况的同学就需要插队,对应这个URG标志位,与16位紧急指针配合使用。即优先读取数据中对应偏移量。一个指针所以一次只能读取一个字节。倒也合理因为插队又不能符合常理。 确认应答机制TCP将每个字节的数据都进行了编号. 即为序列号 每一个ACK都带有对应的确认序列号, 意思是告诉发送者, 我已经收到了哪些数据; 下一次你从哪里开始发 超时重传机制我发数据,你给个回应。我收到了回应,就知道我刚才发的数据你收到了。 我发出数据,不管是数据丢了,还是你收到数据,然后你给我的回应丢了。
假如两个都没丢,只是在网络传输的时间稍微长了一点,超出了这个时间间隔,所以可能会接收到大量重复数据。那么TCP协议需要能够识别出那些包是重复的包, 并且把重复的丢弃掉.这时候我们可以利用前面提到的序列号, 就可以很容易做到去重的效果。 那这个时间间隔该怎么算? 链接管理
三次握手 SYS_SENT:同步发送 四次挥手 LAST_ACK CLOSE_WAIT当我们应用层代码中,close服务器文件描述符,服务器会处于LAST_ACK状态,发送FIN到客户端。但假如我们忘记close,那么就不会处于LAST_ACK状态,也就是会一直处于上一个CLOSE_WAIT状态,没有变化。 TIME_WAIT假如没有这个状态,客户端发一个ACK,从此自己进入CLOSED状态。但是万一对刚才发过来的FIN的ACK丢失了呢。服务器还在傻傻的等着你,服务器会以为自己的FIN没有发过去,进行重传,可是你已经关闭了链接。浪费服务器资源。 总结:
由于某些场景,服务器主动关闭连接,这个时候服务器就会有很多链接进入TIME_WAIT状态,此时有很多新连接过来,虽然调用了close接口,但你又处于TIME_WAIT状态没有完全退出。新连接想用你的端口,被占用,就会出现问题。这是就需要一个接口设置端口可复用。 使用setsockopt()设置socket描述符的 选项SO_REUSEADDR为1, 表示允许创建端口号相同但IP地址不同的多个socket描述符 滑动窗口刚才虽然一次性也发了一批数据,但是经过回复ACK以后才能发送下一批,是串行的。我们一次发送多批数据, 就可以大大的提高性能(其实是将多个段的等待时间重叠在一起了)而一次发多批,当然也要回复多批ACK,同样只要最后一次ACK收到,假如之前的ACK丢了,我们也能容忍少量丢包。 流量控制接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送,就会造成丢包, 继而引起丢包重传等等一系列连锁反应.因此TCP支持根据接收端的处理能力, 来决定发送端的发送速度. 这个机制就叫做流量控制(Flow Control)。报头的16位窗口大小。 拥塞控制虽然TCP有了滑动窗口这个大杀器, 能够高效可靠的发送大量的数据. 但是如果在刚开始阶段就发送大量的数据, 仍然可能引发问题. 此处引入一个叫做慢启动的阈值 少量的丢包, 我们仅仅是触发超时重传; 大量的丢包, 我们就认为网络拥塞 延迟应答假设接收端缓冲区为1M. 一次收到了500K的数据; 如果立刻应答, 返回的窗口就是500K; 那么所有的包都可以延迟应答么? 肯定也不是; 捎带应答在延迟应答的基础上, 我们发现, 很多情况下, 客户端服务器在应用层也是 “一发一收” 的. 意味着客户端给服务器说 三次握手与四次挥手三次握手一次握手行吗 发一次SYN就认为双方建立链接,那和UDP有什么区别。 基于上述,奇数次连接会使客户端发出最后一次报文,而这一次报文丢失不会影响服务器,除了1那么3次就是最小的奇数次连接。 四次挥手全双工,双方都需要关闭链接。需要注意,调用close接口后,指的是应用层不在发送数据,底层还要进行四次挥手所需要的含有FIN与ACK的报文。CLOSED状态才是真正结束,释放数据结构。 TCP总结为什么TCP这么复杂? 因为要保证可靠性, 同时又尽可能的提高性能.
常见问题理解面向字节流写100个字节数据,可以调用write写100,也可以调用100次write。 粘包问题udp面向数据报,应用层发了多少,就必须一次读取多少。而且由于报文中的总长度是定长的所以他明确了边界。不存在粘包问题。 TCP异常情况进程终止: 进程终止会释放文件描述符(但还没有进入CLOSED状态), 仍然可以发送FIN,然后经过四次挥手进入CLOSED状态,所以进程终止和正常关闭没有什么区别。 Listen的第二个参数因为内部资源不够,所以要排队,但不宜太长,会让顾客等的不耐烦。不宜太短,处理完任务可能会空出来位子没人填上去。这就是他的第二个参数,全链接队列的长度,长度为参数+1。全连接队列用来保存处于established状态,且应用层没有调用accept取走的链接。还有一个半连接队列用来保存SYN_SENT和SYN_RECV状态的链接。 分段与分片MSS:最大传输段 (TCP告诉网络层(IP)的) 当TCP的报文大于MSS(MSS位于报文中的可选项)就会分段,分出多个TCP报文。 有了IP层分片,为啥TCP还要分段? UDP没办法,自己没能力分段,超过MTU的话只能靠IP层分片。 |
|
网络协议 最新文章 |
使用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年11日历 | -2024/11/25 18:28:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |