UDP/TCP协议
网络层只负责将数据包送达至目标主机,并不负责将数据包上交给上层的哪一个应用程序,这是传输层需要干的事,传输层通过端口来区分不同的应用程序。传输层协议主要分为UDP(用户数据报协议)和TCP(传输控制协议)
端口
端口可以认为是一台主机上一个进程的标识,这与进程ID一样,只不过端口是网络层面中的概念,而进程ID是操作系统层面的概念。有了端口号,传输层就可以判断应该将数据包交付于哪一个上层应用。
UDP 用户数据报协议
UDP是一种面向数据报、无连接、不可靠但是传输速度快的传输协议。
面向数据报:应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并(如果一次sendto是100字节,那么对端一次recvfrom也必须一次100字节)
无连接:发送端主机不会检测目标主机是否可接受数据报文,知道IP和PORT后直接将数据发送给目标主机
不可靠:无论数据包是否到达目标主机,发送主机不做任何处理(部分丢包)
传输速度快:无连接、不可靠的特点让UDP的实现比TCP简单得多,没有那么多的管理成本
UDP缓冲区
UDP 没有发送缓冲区,只要应用层将数据交付给UDP,那么UDP直接将数据包封装后交给内核处理。
UDP 具有接受缓冲区,只是简单地存放收到的数据包(无序的),缓冲区满了则不再接受数据包(新的报文丢弃)
UDP报文格式
16位报文长度包含报首的6字节
POSIX标准中提供的UDP读写接口
读取UDP报文 recvfrom
发送UDP报文 sendto
TCP 传输控制协议
TCP通过确认应答,超时重传等机制确保了数据报文的可靠传输,通过滑动窗口、延迟应答等机制确保较高的效率,通过流量控制和拥塞控制确保网络环境的通畅,代价是大大提高了管理成本,传输速度逊色于UDP
POSIX标准中提供的TCP读写接口
recv读取TCP报文
send发送TCP报文
TCP确认应答
为了保证数据包正确到达目标主机端口,TCP规定当目标主机收到报文时需要向源主机发送ACK应答,告诉源主机我已经收到了数据
序列号
网络环境复杂多变,不能保证数据包都可以严格按照发送顺序到达目标主机,但是由于TCP需要保证可靠传输,它必须对这些无序的数据包进行排序再向上层交付,TCP借助序列号的方式标识顺序
发送端需要在TCP报首中写入序列号,序列号为相对正文起始的偏移量
接受端在发送确认应答时在TCP报首中写入确认序列号,表示已经收到了该序列号之前的所有数据,同时确认序列号也告诉发送端下一次该从偏移量为多少处开始发送
TCP超时重传
我们先假设TCP是串行发送数据报文的,即只有收到最近一次数据包的ACK应答才会继续发送数据给目标。在网络传输过程一定会存在数据包丢失的情况发生,要么是数据包本身丢失,要么是ACK应答丢失,无论哪种情况,发送端都需要对异常进行处理。
如果在一定时间内没有收到目标主机发来的ACK应答,就判定此次数据发送失败,进行重新发送
滑动窗口
如果数据是串行发送的话,由于每一次都需要等待对端应答,网络的传输速度是相对较慢的,这会造成极大的延迟,大大降低传输效率,TCP引入滑动窗口机制来批量的发送数据
窗口分为已确认数据,未确认数据,未发送数据
一次批量发送数据后增加窗口的长度
收到ACK应答后缩小窗口长度
滑动窗口允许部分应答丢失
引入了滑动窗口之后,发送端不再需要串行的发送数据报文,可以一次发送多个数据报文,并且允许部分应答丢失
滑动窗口数据本身丢包如何解决
如果批量发送的数据包部分丢失,发送端可以根据对端的应答报文中的确认序列号进行重发,如果收到了3此确认序列号相同的应答报文,就认为出现了丢包,触发快重传机制,快重传和超时重传相互配合,保证可靠性(超时重传用于兜底最后一个应答未收到的情况)
快重传
流量控制
TCP是具有发送缓冲区和接受缓冲区机制的,虽然引入采用滑动窗口的机制使得发送端可以一次性发送多个数据包,但这并不意味着发送数据包的个数是可以任意的,必须考虑到对端接受缓冲区的承载能力,,如果对端告知接受缓冲区快要不足时,发送端应该减少单次数据发送量或是阻塞等待;对端接受缓冲区的大小通过TCP报文中的窗口大小字段来表明
当接收端的窗口空闲后会向发送端发送窗口更新通知报文,告知可以恢复通信,但是这个报文可能会丢失,就需要依靠发送端的窗口探测机制来兜底了,如果长时间收不到窗口更新通知,发送端为认为窗口更新通知在网络中丢失,此时会向对端发送窗口探测请求,对端接受后会再次发送窗口更新通知
TCP连接管理
TCP是面向连接的,主机间通信必须先建立连接,否则无法通信。客户端如果想要和服务端通信,需要向服务端发送请求,收到服务端应答之后建立连接开始通信,当某一端断开连接时,也需要发送结束请求进行同步。建立TCP连接的过程为3次握手,断开TCP连接的过程为4次挥手
TIME_WAIT
主动断开连接的一方需要进入TIME_WAIT状态,只有经过一定时间后才能真正关闭套接字文件描述符,之所以要进行time wait等待是避免端口被复用时收到之前的残余数据,time wait的具体时间通常为2MSL(TCP最大生存时间),经过2MSL时间后可以确保该该端口最近一次连接的数据已经全部消散(要么已经被接受,要么丢包)
全连接队列
POSIX提供的TCP监听接口listen的第二个参数为允许建立连接的最大数量,内核将处于established状态但未被应用层所使用的套接字以链表方式级联,称为全连接队列(为established之前称为半连接队列),过多的连接增加服务器的负担,因此在开发过程中应该选择一个合适的阈值
拥塞控制
有了滑动窗口,收发主机之间能够连续发送大量数据包。然而,如果在通信刚开始时就发送大量数据,可能会引发网络拥堵的问题。一般来说,计算机网络都处在一个共享环境中,因此有可能因为其他主机之间的通信使得网络变得拥堵,在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能导致网络瘫痪。TCP为了防止网络瘫痪,在通信一开始时会通过慢启动算法进行控制数据发送量。
为了在发送端调节所要发送数据的量,定义了一个叫做拥塞窗口的概念。在慢启动的时候,将拥塞窗口大小设置为1个数据包(1 MSS)的大小发送数据,每次收到一个ACK应答,拥塞窗口增加1 MSS,在发送数据包时,将拥塞窗口大小与接收端窗口大小取小作为发送的数据量。如果触发了超时机制,就认为发送数据量过大了,已经出现了网络拥堵,此时将拥塞窗口归置为1MSS
拥塞窗口的大小时呈现指数级增长的,为了避免指数爆炸的问题,引入了慢启动阈值的概念,如果窗口大小超过了慢启动阈值,之后便以线性方式增长
延迟应答
接受主机如果每次都立刻恢复确认应答,可能会返回一个较小的窗口(刚接收完数据,缓冲区已满),但其实窗口可能在很短的时间内就会有大量空闲空间,如果此时发送端收到了缓冲区已满的通知,会减少数据发送量从而降低网络利用率。解决这个问题的办法就是收到数据后并不立即返回确认应答,而是延迟一段时间。(延迟时间根据平台而定)
此外并不是每收到一个报文都是需要ACK应答的,只需要返回确认序列号最大的那个应答报文就可以告知发送端之前的数据已经接收,从而减少网络中冗余数据报文的个数。TCP传输中绝大多数是以2个数据报文为单位返回一次确认应答
捎带应答
在延迟应答的基础上,很多情况下, 客户端服务器在应用层也是 “一发一收” 的. 意味着客户端给服务器发送了SYN请求连接时, 服务器也会给客户端回一个ACK确认应答,那么这个时候服务器请求与客户端的SYN请求连接就可以搭顺风车, 和服务器回应的 ACK一起回给客户端(三次握手中的第二次握手)
面向字节流
创建一个TCP的socket, 内核中为socket创建一个 发送缓冲区 和一个 接收缓冲区;
调用write时, 数据会先写入发送缓冲区中; 如果发送的字节数太长, 会被拆分成多个TCP的数据包发出; 如果发送的字节数太短, 就会先在缓冲区里等待, 等到缓冲区长度差不多了, 或者其他合适的时机发送出去;
接收数据的时候, 数据也是到达内核的接收缓冲区; 然后应用程序可以调用read从接收缓冲区拿数据;
不想UDP一样每一次收发必须以一个数据报进行收发,TCP写100个字节数据时, 可以调用一次write写100个字节, 也可以调用100次write, 每次写一个字节; 读100个字节数据时, 也完全不需要考虑写的时候是怎么写的, 既可以一次read 100个字节, 也可以一次 read一个字节, 重复100次。对于应用层而言TCP包就是一串连续的字节序列,它是否是一个完整的报文是未知的。
粘包问题
由于UDP是面向数据报的,意味着报文有很明确的数据边界.站在应用层的站在应用层的角度, 使用UDP的时候, 要么收到完整的UDP报文, 要么不收. 不会出现"半个"或“一个半”的情况,因此不存在粘包问题
在TCP的协议头中, 没有如同UDP一样的 “报文长度” 这样的字段, 但是有一个序号这样的字段.站在传输层的角度, TCP是一个一个报文过来的. 按照序号排好序放在缓冲区中.站在应用层的角度, 看到的只是一串连续的字节数据.那么应用程序看到了这么一连串的字节数据, 就不知道从哪个部分开始到哪个部分, 是不是一个完整的应用层数据包(可能多了,可能少了)
降低粘包概率
- 对于定长的包, 保证每次都按固定大小读取
- 对于变长的包, 可以在正文处约定一个表示总长度的定长字段, 从而知道了包的结束位置;
- 对于变长的包, 还可以在包和包之间使用明确的分隔符;
TCP报文格式
数据偏移代表报首长度,TCP报首中是没有指示正文长度的字段的
控制位Control Flag
字段长8位,为1代表触发条件,每一位代表一种控制标志
- URG:紧急指针,表示包中有需要紧急处理的数据
- ACK:确认应答,除第一次握手之外的所有报文都必须置ACK位为1
- SYN:用于建立连接,置1时表示希望建立连接
- FIN:表示需要断开连接
- PSH:表示需要将数据尽快上交给应用层,通常在接受端接收缓冲区不足时触发
- RST:强制断开连接
- CWR\ECE:通知拥塞窗口的变化
相关文章:

UDP/TCP协议
网络层只负责将数据包送达至目标主机,并不负责将数据包上交给上层的哪一个应用程序,这是传输层需要干的事,传输层通过端口来区分不同的应用程序。传输层协议主要分为UDP(用户数据报协议)和TCP(传输控制协议…...

gitee建立/取消关联仓库
目录 一、常用指令总结 二、建立关联具体操作 三、取消关联具体操作 一、常用指令总结 首先要选中要关联的文件,右击,选择Git Bash Here。 git remote -v //查看自己的文件有几个关联的仓库git init //初始化文件夹为git可远程建立链接的文件夹…...

在 Windows 环境下,Git 默认会自动处理 CRLF 和 LF 之间的转换。
在 Windows 环境下,Git 默认会自动处理 CRLF 和 LF 之间的转换。 要确保这一点并自动处理换行符差异,你可以按照以下步骤配置 1. 配置 Git 自动转换 CRLF 使用 Git Bash 或命令行执行以下命令,设置 Git 自动处理换行符: git con…...

Kibana可视化Dashboard如何基于字段是否包含某关键词进行过滤
kinana是一个功能强大、可对Elasticsearch数据进行可视化的开源工具。 我们在dashboard创建可视化时,有时需要将某个index里数据的某个字段根据是否包含某些特定关键词进行过滤,这个时候就可以用到lens里的filter功能很方便地进行操作。 如上图所示&…...

架构师之路-学渣到学霸历程-23
实战:NFS安装部署 接早上了解过了NFS的一些基本原理,咋们就看看一些实战; 尝试自己部署一下实验;然后实验成功了是我们最大的鼓励来着; 实战过程中,我们也面临了很多报错;所以每个实战的报错我…...

怎么修改编辑PDF的内容,有这4个工具就行了。
PDF 软件在现代的办公或者是学习当中的应用非常广泛,编辑PDF内容对很多人来说也是一件常有的事情。如果有了PDF 编辑软件,查看,编辑,修改,分享也会变得更加方便简单,所以今天要给大家介绍几款这样的工具。 …...

腾讯云宝塔面板前后端项目发版
后端发版 1. 打开“网站”页面,找到java项目,点击状态暂停服务 2.打开“文件”页面,进入jar包目录,删除原有的jar包,上传新jar包 3. 再回到第一步中的网站页面,找到jar项目,启动项目即可 前端发…...

C语言的结构体定义 java赋值关系运算符
1. /*#include<stdio.h> struct student { int num; //成员列表 int score; float avg; }; int main(void) { struct student Tom;//Tom结构体变量 struct student class4[50];//结构体数组 return 0; }*/ struct student { int nu…...

重学SpringBoot3-Spring WebFlux简介
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-Spring WebFlux简介 1. 什么是 WebFlux?2. WebFlux 与 Spring MVC 的区别3. WebFlux 的用处3.1 非阻塞 I/O 操作3.2 响应式编程模型3.3 更高…...

distinct 和 group by
最近生产加了一个新字段 a、然后将主键赋值给 a 然后投产后验证是否有漏网之鱼。当时使用的是 select count(distinct pk),count(distinct a) from tableName当时在想这样子跟 group by 有啥区别 select a from tableName group by a having count(a) > 1所以查一下两者…...

RTThread-Nano学习一-基于MDK移植
一、简介 关于RTThread-nano的介绍,这里不做过多解释,官方文档已经介绍的非常详细了,有兴趣的可以参考如下文档:RT-Thread 文档中心 二、移植 1.准备一个能正常运行的代码 手头有M0内核的板子,那就以…...

Vue中v-bind对样式控制的增强—(详解v-bind操作class以及操作style属性,附有案例+代码)
文章目录 v-bind对样式控制的增强2.1 操作class2.1.1 语法2.1.2 对象语法2.1.3 数组语法2.1.4 使用2.1.5 Test 2.2 操作style2.2.1 语法2.2.2 使用2.2.3 Test v-bind对样式控制的增强 2.1 操作class 2.1.1 语法 <div> :class "对象/数组">这是一个div&l…...

【分布式微服务云原生】《ZooKeeper 深度探秘:分布式协调的强大利器》
**《ZooKeeper 深度探秘:分布式协调的强大利器》 ** 摘要:本文将深入详解 ZooKeeper,涵盖其工作原理、实现分布式锁的方法、应用场景、负载均衡的实现以及不同角色的作用等内容。读者将全面了解 ZooKeeper 的强大功能和价值,为构…...

打造高性能在线电子表格:WebGL 渲染引擎 Kola2d 自研之路
导读:本文主要阐述了 Docs 在线表格为打造极致渲染性能所做的关键优化和过程思考,作为首个在在线电子表格领域自研基于WebGL渲染引擎的「吃螃蟹」者,整个过程面临诸多不确定性与挑战,Kola2d 的整体设计在此期间也经历了几轮推倒重…...

深入理解WPF中的命令机制
Windows Presentation Foundation(WPF)是微软推出的一种用于构建桌面客户端应用程序的技术。它被认为是现代Windows应用程序的基础,具有强大的图形和媒体处理能力。在WPF中,“命令”是一个重要的概念,它为应用程序开发…...

基础算法(6)——模拟
1. 替换所有的问号 题目描述: 算法思路: 从前往后遍历整个字符串,找到问号之后,尝试用 a ~ z 的每一个字符替换即可 注意点:需考虑数组开头和结尾是问号的边界情况 代码实现: class Solution {public …...

2025年广西高考报名流程图解(手机端)
广西 2025 年高考报名时间已经确定啦,从 2024 年 10 月 21 日开始,到 10 月 31 日 17:30 结束 💻【报名路径】 有电脑端和手机端两种选择哦。 电脑端:登录 “广西招生考试院” 网站(https://www.gxeea.cn࿰…...

十、结构型(外观模式)
外观模式(Facade Pattern) 概念 外观模式(Facade Pattern)是一种结构型设计模式,旨在为复杂子系统提供一个简化的统一接口。通过外观模式,客户端可以与子系统交互,而无需了解子系统的内部复杂性…...

10.12Python数学基础-矩阵(上)
矩阵 1.矩阵定义 1.1 矩阵的定义 矩阵是由一组数按照矩形排列而成的数表。矩阵通常用大写字母表示,例如 AA、BB 等。矩阵中的每个数称为矩阵的元素或元。 一个 mn的矩阵 AA 可以表示为: A ( a 1 n a 12 … a 1 n a 21 a 22 … a 2 n ⋮ a m 1 a m 2…...

重学SpringBoot3-安装Spring Boot CLI
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-安装Spring Boot CLI 1. 什么是 Spring Boot CLI?2. Spring Boot CLI 的安装2.1. 通过 SDKMAN! 安装2.2. 通过 Homebrew 安装(适…...

代码复现(五):GCPANet
文章目录 net.py1.class Bottleneck:残差块2.class ResNet:特征提取3.class SRM:SR模块4.class FAM:FIA模块5.class CA:GCF模块6.class SA:HA模块7.class GCPANet:网络架构 train.pytest.py 论文…...

联邦学习实验复现—MNISIT IID实验 pytorch
联邦学习论文复现🚀 在精度的联邦学习的论文之后打算进一步开展写一个联邦学习的基础代码,用于开展之后的相关研究,首先就是复现一下论文中最基础也是最经典的MNIST IID(独立同分布划分) 数据集。然后由于这个联邦学习的论文是谷歌发的&#…...

2015年-2017年 计算机技术专业 程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析
文章目录 20151.C语言算法设计部分2.数据结构算法设计部分 20161.C语言算法设计部分2.数据结构算法设计部分 2017年1. C语言算法设计部分2.数据结构算法设计部分 2015 1.C语言算法设计部分 int total(int n) {if(n1) return 1;return total(n-1)n1; } //主函数测试代码已省略…...

个人用计算理论导引笔记(待补充)
文章目录 一、正则语言预备知识确定性有穷自动机(DFA)设计DFA正则运算 非确定性有穷自动机(NFA,含有 ε \varepsilon ε,下一个状态可以有若干种选择(包括0种))正则表达式定义计算优…...

2024年诺贝尔物理学奖揭晓:AI背后的“造梦者”是谁?
想象一下,你早上醒来,智能音箱为你播放天气和新闻,中午你用手机刷视频,精准的推荐内容简直和你心有灵犀,晚上回家,自动驾驶汽车安全地把你送回家。这一切看似理所当然,背后却有一双无形的手推动…...

2024年AI 制作PPT新宠儿,3款神器集锦,让你的演示与众不同
咱们今儿聊聊最近超火的AI做PPT的工具。这年头,谁不想省事儿,少熬夜加班,多享受享受生活啊?所以,AI开始帮咱们搞定做PPT这种费时的活儿,我自然得好好研究研究。今天,我就给大家详细说说三款很火…...

CLion和Qt 联合开发环境配置教程(Windows和Linux版)
需要安装的工具CLion 和Qt CLion下载链接 :https://www.jetbrains.com.cn/clion/ 这个软件属于直接默认安装就行,很简单,不多做介绍了 Qt:https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/ window 直接点exe Linux 先c…...

Qt记录使用QtAwesome
Qt记录使用QtAwesome 基本使用 基本使用 pro文件添加 CONFIG fontAwesomeFree include(QtAwesome/QtAwesome.pri) //实例化QtAwesome fa::QtAwesome* awesome new fa::QtAwesome(this); awesome->initFontAwesome();//设置外置适应 图标ICON的颜色color QVariantMap opt…...

ES6新增promise(异步编程新解决方案)如何封装ajax?
1.什么是异步? 异步是指从程序在运行过程中可以先执行其他操作。 2.什么是promise? Promise 是 ES6 引入的异步编程的新解决方案。语法上 Promise 是一个构造函数,用来封装异步 操作并可以获取其成功或失败的结果; 3.promise成功…...

Kubernetes--深入理解Service与CoreDNS
文章目录 Service功能Service 的常见使用场景 Service的模式iptablesIPVS Service类型ClusterIPNodePortLoadBalancerExternalName Service的工作机制EndpointEndpoint 与 Service 的关系Endpoint 的工作原理命令操作 CoreDNSCoreDNS 的配置CoreDNS 的典型插件Corefile 示例Cor…...