传输层协议

文章目录

  • 端口号
  • UDP协议
    • UDP报文
    • UDP发送数据报过程
  • TCP协议
    • TCP报文
    • 确认应答
    • 超时重传
    • 连接管理
    • 流量控制
    • 拥塞控制
    • 补充
    • 小结
  • UDP实现TCP
  • 总结
    • TCP和UDP的区别

端口号

端口号(Port)标识了一个主机上进行通信的不同的应用程序。

简单的说,就是两台主机通信时,要想准确无误的在庞大复杂的互联网里找到目的主机就需要ip地址,而在目的主机众多应用程序里找到对应通信的程序则需要端口号

  • 常见的端口号
    FTP 21
    SSH 22
    telnet 23
    http 80
    https 443

UDP协议

  • 特性:不可靠,无连接,面向数据报

UDP报文

在这里插入图片描述
包长度:就是数据报最大长度。即最大长度为216B=64KB
ps:这里的64KB大小是整个udp报文的最大大小,是包括报头长度8B。

在Linux源码里大概如下

struct udp_header
{
	uint16_t src_port;
	uint16_t dst_port;
	uint16_t udp_len;
	uint16_t check;
};

UDP发送数据报过程

通信双发只要知道对方的ip和端口,就可以使用udp协议发送udp报文数据,对方的接受缓冲区就会接受,若是对方的接收缓冲区数据满了,再次发送数据包,就会产生丢包现象。

基于UDP应用层的协议:NFS,DNS,DHCP

TCP协议

  • 特性:可靠,有连接,面向数据流

TCP报文

在这里插入图片描述

  • 序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题
  • 确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。
  • 首部长度:单位4B,表示TCP首部长度的大小。4位表示范围是[0, 15],所以TCP首部最大为60B,即选项长度最大为40B
  • 标志位:区别不同类型的报文
    ACK:确认应答报文(可能会携带数据 --> 捎带应答)
    SYN:连接请求报文
    FIN:断开连接报文
    RST:重连请求报文
    PSH:催促请求报文,用于提示接收端立刻取走接收缓冲区里的内容
    URG:紧急报文,通过特殊方式传送紧急数据

确认应答

无论成功与否,一段都能准确清楚地知道所发数据报的状态

在这里插入图片描述

如图:
第一次握手:C端发SYN和序列号seq = x
第二次握手:S端发ACK+SYN和确认应答号ack=x+1,序列号seq = y。表示S端收到x前的消息,并发生自己的消息序列seq
第三次握手:C端收到消息,建立连接,发送ACK,确认应答号ack=y+1,序列号seq=x+1。表示C端收到y消息前的所有消息,seq=x+1表示消息从x+1开始。

每一次握手都可以清楚确认数据报的状态。

超时重传

无论哪一方在通信时,所处的某一段时间内未收到对方的应答消息,就会进行数据重发。
TCP协议会根据网络状态制定超时重传时间。时间太短,导致重传大,时间太长,重传效率低。

在这里插入图片描述

连接管理

三次握手和四次挥手的全过程

在这里插入图片描述
客户端

状态过程
[CLOSED -> SYN_SENT]客户端调用connect, 发送同步报文段;
[SYN_SENT -> ESTABLISHED]connect调用成功, 则进入ESTABLISHED状态, 开始读写数据;
[ESTABLISHED -> FIN_WAIT_1]客户端主动调用close时, 向服务器发送结束报文段, 同时进入FIN_WAIT_1;
[FIN_WAIT_1 -> FIN_WAIT_2]客户端收到服务器对结束报文段的确认, 则进入FIN_WAIT_2, 开始等待服务器的结束报文段;
[FIN_WAIT_2 -> TIME_WAIT]客户端收到服务器发来的结束报文段, 进入TIME_WAIT, 并发出LAST_ACK;
[TIME_WAIT -> CLOSED]客户端要等待一个2MSL(Max Segment Life, 报文最大生存时间)的时间, 才会进入CLOSED状态
  • 为什么要等2MSL:为了让网络中传输的数据全部消失,从而不影响下次端口的数据传输

服务端

状态过程
[CLOSED -> LISTEN]服务器端调用listen后进入LISTEN状态, 等待客户端连接
[LISTEN -> SYN_RCVD]一旦监听到连接请求(同步报文段), 就将该连接放入内核等待队列中, 并向客户端发送SYN确认报文
[SYN_RCVD -> ESTABLISHED]服务端一旦收到客户端的确认报文, 就进入ESTABLISHED状态, 可以进行读写数据了
[ESTABLISHED -> CLOSE_WAIT]当客户端主动关闭连接(调用close), 服务器会收到结束报文段, 服务器返回确认报文段并进入CLOSE_WAIT
[CLOSE_WAIT -> LAST_ACK]当服务器真正调用close关闭连接时, 会向客户端发送FIN, 此时服务器进入LAST_ACK状态, 等待最后一个ACK到来(这个ACK是客户端确认收到了FIN)
[LAST_ACK -> CLOSED]服务器收到了对FIN的ACK, 彻底关闭连接
  • CLOSE_WAIT:如果没有调用close()关闭连接,则服务端会长时间保持这种状态,造成文件描述符fd泄露

流量控制

TCP支持根据接收端的处理能力, 来决定发送端的发送速度. 这个机制就叫做流量控制

过程:在建立三次握手的过程中,双方可以获得TCP报文里相应对方的接收缓存区大小,此时就可以进行流量控制了。期间若S端接收缓冲区满了,C端就会定时进行窗口检测(会发PSH类型报文催促),S端有空间了也会主动向C端发送窗口更新通知(以报文形式)

  • 滑动窗口
    在这里插入图片描述
  • 滑动窗口大小 = min(拥塞窗口,对方缓冲区大小)
  • 滑动窗口在代码里的实现就是两个下标指针——[win_start, win_end]
    win_start = seq
    win_end = seq + min(滑动窗口大小, 拥塞窗口大小)
  • 滑动窗口只能向右移动
  • 数据丢包,窗口不动,等待重传
  • 应答(ACK)丢了,无关紧要。(收到三次及以上相同的ACK报文,就会进行快重传

拥塞控制

从始至终,TCP协议都在对网络状况进行探测,这一过程就是拥塞控制

在这里插入图片描述
慢启动后,拥塞窗口开始以指数速率增长,达到阈值(ssthresh)后进行拥塞避免,线性速率增长,一旦发生网络拥塞,阈值 = 拥塞窗口 / 2,拥塞窗口 = 1,往复执行。

补充

  • 捎带应答:为了提高TCP的工作效率,有时会将两个可以合并的报文合二为一。三次握手中的第二次握手就是使用了捎带应答,(SYN+ACK报文,两个报文合二为一)。
  • 延迟应答:为了提高TCP的传输效率,接收端在收到应答后会等待一段时间或每几个包在应答一次(200ms或2个包)。

小结

做法
可靠性校验和,序列号,确认应答,超时重传,连接管理,流量控制,拥塞控制
提升性能滑动窗口,延迟应答,捎带应答,快速重传

这里只小结了上述介绍的,肯定是不全面的,读者可以自行拓展学习

UDP实现TCP

引导:只要从TCP实现可靠性方面思考即可

UDP想实现TCP,无非就是实现TCP的可靠性,所以我们可以给UDP加入确认应答(确认号,序列号),超时重传,流量控制即可初步实现TCP;若要提升性能可以加入滑动窗口,延迟应答,捎带应答,快速重传。

总结

TCP和UDP的区别

从两者的特点展开比较

  • 有/无连接
    UDP:多用于DNS,DHCP,视频,多媒体通信
    TCP:多用于HTTP/HTTPS

  • 面向数据报/数据流
    数据报无边界,易丢包,乱序
    数据流有边界,可靠,有序

  • 有无可靠性
    从报头可区分
    UDP:8字节大小,4个字段,短小精干。
    TCP:20字节大小,包含各种实现可靠性和效率的字段。(这里又可以展开补充区别)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/89780.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux内核学习(八)—— 内存管理(基于Linux 2.6内核)

目录 一、页(page) 二、区(zone) 三、页操作 四、kmalloc() 五、vmalloc() 六、slab 分配器 七、在栈上的静态分配 一、页(page) 内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻 …

Notepad++正则匹配

Notepad正则匹配 Notepad正则表达式字符串最长不能超过69个字符一、支持的语法二、正则表达式诀窍三、案例3.1、匹配时间戳3.2、提取指定字符串3.3、提取单词3.4、查找中文字符 四、示例4.1、示例1:把含目标字符串及之后的字符串全部替换4.2、示例2:4.3、…

项目部署之后页面没有刷新怎么办?

最近项目部署成功之后,突然产品找我,上线之后,页面没有生效,这是怎么回事?我这是第一次部署这个项目,也不太清楚历史问题,接下来就慢慢寻找答案吧, 如果心急的可以直接看后面的总结,下面我们好好聊聊缓存的…

RE:从零开始的车载Android HMI(四) - 收音机刻度尺

最近比较忙,研究复杂的东西需要大量集中的时间,但是又抽不出来,就写点简单的东西吧。车载应用开发中有一个几乎避不开的自定义View,就是收音机的刻度条。本篇文章我们来研究如何绘制一个收音机的刻度尺。 本系列文章的目的是在讲…

4.12 TCP 连接,一端断电和进程崩溃有什么区别?

目录 TCP keepalive TCP 的保活机制 主机崩溃 进程崩溃 有数据传输的场景 客户端主机宕机,又迅速重启 客户端主机宕机,一直没有重启 TCP连接服务器宕机和进程退出情况总结 TCP keepalive TCP 的保活机制 TCP 保活机制需要通过 socket 接口设置 S…

pytorch 实现VGG

VGG全称是Visual Geometry Group,因为是由Oxford的Visual Geometry Group提出的。AlexNet问世之后,很多学者通过改进AlexNet的网络结构来提高自己的准确率,主要有两个方向:小卷积核和多尺度。而VGG的作者们则选择了另外一个方向&a…

在Ubuntu上安装和设置RabbitMQ服务器,轻松实现外部远程访问

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

编码基础一:侵入式链表

一、简介概述 1、普通链表数据结构 每个节点的next指针指向下一个节点的首地址。这样会有如下的限制: 一条链表上的所有节点的数据类型需要完全一致。对某条链表的操作如插入,删除等只能对这种类型的链表进行操作,如果链表的类型换了&#…

牛客网Verilog刷题 | 入门特别版本

文章目录 1、 VL1 输出12、VL2 wire连线3、 VL3 多wire连接4、VL4 反相器5、VL5 与门6、VL6 NOR 门7、VL7 XOR 门8、VL8 逻辑运算10、VL10 逻辑运算211、VL11 多位信号12、VL12 信号顺序调整13、VL13 位运算与逻辑运算14、VL14 对信号按位操作15、VL15 信号级联合并16、VL16 信…

安装Docker并配置镜像加速器、容器

1.安装docker服务,配置镜像加速器 安装软件包 [rootlocalhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 设置yum源 [rootlocalhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo…

【问题处理】解决Spring事务@Transactional多层嵌套失效

场景: 在 AService 中,我会直接调用 A 的数据操作层去操作 A的数据 以及 A关联密切的其它数据,在操作完之后,会去调用 BService 和 CService 中更新对应的数据,并在每个方法上使用了事务,但在调用 BService…

VMware 中Centos8的NAT网络设置

1、先将虚拟机设置为NAT模式 2、打开虚拟网络编辑器,记录以下信息 NAT设置:子网掩码、网关 DHCP设置:I P 范围 (自动时) 3、进入Centos8的网络设置页面,按照记录的信息进行配置 4、重载、重启网卡 nmcli c reload ensl60 n…

4G电力摄像机如何通过AT指令对接到国网平台呢?

对于针对电网安全运行的迫切需求,”输电线路智能可视化监测系统”被研发并应用,通过视频监控和AI智能分析技术,实现了对输电线路远程视频在线监测、外力破坏智能分析,可实现对输电线路的全天候实时监测和预警,有效保障…

element plus 的图片上传组件回显

element图片回显是通过修改file-list属性的url属性实现的。 <!-- 图片上传 --><el-form-item label"景区图片" prop"s_img"><el-uploadlist-type"picture-card":action"网址":on-change"handleChange":befor…

【KingSCADA】问题处理:记录KS历史报警查询异常

哈喽&#xff0c;大家好&#xff01;我是雷工。 本篇记录KingSCADA的历史报警应用中的一个问题&#xff0c;及处理过程。 一、问题描述 最近客户遇到这么一个问题&#xff1a;当打开历史报警窗界面&#xff0c;自动加载的报警信息中有显示最近几天的报警信息&#xff0c;但当…

[JavaWeb]【十二】web后端开发-事务管理AOP

目录 一、事务管理 1.1 事务回顾 1.2 Spring事务管理 1.2.1 案例 1.2.1.1 EmpMapper新增deleteByDeptId方法 1.2.1.2 DeptServiceImpl 1.2.1.3 启动服务-测试 1.2.2 模拟异常 1.2.3 分析问题 1.2.4 Spring事务管理&#xff08;一般用在类似多次delete&#xff09; 1.2.4…

【快速傅里叶变换(fft)和逆快速傅里叶变换】生成雷达接收到的经过多普勒频移的脉冲雷达信号(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Jupyter Notebook 配置根目录

注&#xff1a;本文是在 Windows 10 上配置 Jupyter Notebook 打开的默认根目录&#xff0c;Linux 同。 步骤一&#xff1a;创建 Jupyter Notebook 配置文件 使用以下命令创建 Jupyter Notebook 配置文件&#xff08;如果尚未创建&#xff09;&#xff1a; jupyter notebook …

SecureBridge安全文件下载的组件Crack

SecureBridge安全文件下载的组件Crack SecureBridge包括SSH、SSL和SFTP客户端和服务器组件。它使用SSH或SSL安全传输层协议和加密消息语法来保护任何TCP流量&#xff0c;这些协议为客户端和服务器提供身份验证、强数据加密和数据完整性验证。SecureBridge组件可以与数据访问组件…

Neo4j实现表字段级血缘关系

需求背景 需要在前端页面展示当前表字段的所有上下游血缘关系&#xff0c;以进一步做数据诊断治理。大致效果图如下&#xff1a; 首先这里解释什么是表字段血缘关系&#xff0c;SQL 示例&#xff1a; CREATE TABLE IF NOT EXISTS table_b AS SELECT order_id, order_status F…