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 安装(适…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...
