传输层_TCPUDP

应用层中调用write/send``recv/read这些系统接口,并没有将数据发送到网络中,而是向下交付到传输层协议,具体什么时候发送数据,由传输层根据一些策略进行数据的实际发送。
传输层的主要功能就是负责数据的传输,包括如果数据丢失,重复,乱序,发送太快太慢等等一些数据传输可靠性问题。传输层就是根据用户的要求从而解决数据传输的问题。传输层的协议主要由TCP和UDP两种协议。TCP协议是可靠传输的,如果用户想要更可靠的传输就用TCP协议;如果用户追求效率,那么可以使用UDP协议,它是不可靠的,没有面向连接的,因此速度会比TCP协议快一些。

一.UDP

1.1 UDP协议格式

image.png
由于UDP报头是固定8字节的,所以根据16位UDP长度与8字节,可以知道当前UDP报文中有效载荷的大小,因此不会出现有效载荷没有读完的情况。当把有效载荷读完后,UDP协议根据报头中的16位目的端口号,将有效载荷中的数据交付给上层应用程序。
由于传输层属于操作系统层,而UDP在内核中是一个结构体,在底层传输不需要序列化与反序列化,因为在所有操作系统中,都强制规定了协议结构体的报头大小位8字节,不用考虑内存对齐了。

1.2 特点
  1. 无连接:知道对端的端口号即可通信,不用考虑对方在不在。
  2. 不可靠:没有确认机制,没有重传机制
  3. 面向数据报:应用层交给UDP多长的报文,UDP原样发送和接收。这种方式不够灵活,但简单。
1.3 UDP缓冲区
  1. UDP没有真正意义上的发送缓冲区,调用sendto会直接交给内核,由内核将数据传给网络层协议后,进行后续传输。
  2. UDP具有接收缓冲区,但这个缓冲区不能保证收到的UDP报的顺序和发送的一致,如果缓冲区满了,再到达的UDP数据就会被丢弃。
  3. 使用UDP发送数据,一次最多只能发送64KB,超过该容量,用户只能自己分片。

二.TCP

2.1 TCP协议格式

image.png

  • 4位首部长度:以4字节位单位,标识TCP报头的大小在20-60字节之间。根据这个字段,可以将TCP有效载荷与报头分离
  • 32位序号、32位确认序号:TCP会给报文一个序号,这个序号能保证在TCP接收报文时,报文不会重复、不会丢失、接收顺序不会乱。32位确认序号就是对端告诉接收方,我接收到了确认序号之前的所有报文,你下次发送的报文序号应该从确认序号开始。
  • 16位窗口大小:里面指明了自己接收缓冲区的剩余容量,防止对端发送消息过快/过慢,这种机制就是流量控制。
  • URG:紧急指针标识位,标识该报文中有紧急数据
  • ACK:标识该报文是一个应答报文
  • PSH:催促对端快速处理缓冲区中的数据,让缓冲区的数据处于就绪状态
  • RST:当客户端与服务器进行连接协商时,如果客户端认为连接建立成功,服务端连接失败。如果此时客户端发送消息,但是服务端因为没有连接,所以导致双方连接状态不一样,此时服务器就会给客户端发送一个RST报文,让客户端端重新建立连接
  • SYN:标识该报文是在请求连接
  • FIN:标识该报文是在请求断开连接
  • 上面六位标志是为了区分不同种类的报文,对于每一种报文有其处理方式,并且多个标志可以同时设置。
  • 紧急指针(带外数据):填入紧急数据(1字节)在缓冲区中的偏移量,可以通过recv第四个参数flags设置为MSG__OOB
2.2 TCP可靠性

如果要理解TCP的可靠性,那么我们就要明白什么时候是不可靠的。比如丢包(大量,少量)、重复、乱序、发送太快/太慢,这些都是不可靠的表现。那么TCP是如何知道自己发送的报文丢了呢?这就要引入TCP的确认应答机制了,如果在一个时间段内没有收到应答报文,那么TCP就会认为自己的报文丢失了,然后重新发送报文。
TCP的报文按照顺序发送,但因为网络原因,它们有可能是乱序到达的,如果要保证可靠性,TCP就要给每个报文一个序号,这个序号既可以让报文有序接收,又可以防止报文重复的情况发生。

  • 确认序号X:x-1之前的报文收到了,下次请从x开始发送。这样可以更细粒度的找到丢包原因,允许少量应答报文丢失

TCP可靠性机制:

  1. 确认应答(ACK)机制
  2. 超时重传

TCP为了保证无论在任何环境下都能比较高性能的通信,会动态计算等待的时间,Linux中,超时是以500ms为单位进行控制的,每次判定重传的时间都为500ms的整数倍。如果重发一次后,仍然得不到应答,等待2500ms后再进行重传。如果仍然得不到应答,等待4500ms,以此类推。如果在经过一定次数等待后,仍然收不到应答,那么TCP认为网络/对端主机出现异常,强制关闭连接。

  1. 连接管理机制

在双发主机通信时,双发TCP要经过三次握手建立连接,当通信结束时,双方TCP要经过四次挥手断开连接。
连接在操作系统就是一种数据结构,维护这个连接是要消耗系统资源的。
三次握手和四次挥手:
建立连接的过程是TCP自动完成的,即OS自动完成的,我们上层调用的connect()是发起连接,然后阻塞等待连接完成获取连接,accpet() 是默认阻塞等待连接完成,获取连接。
image.png

三次握手是判断双方通信信道流通的最小成本。当三次握手中,前两个报文丢失,那么客户端会触发超时重传,如果第三个报文丢失,那么客户端与服务器对于连接的状态认知不一样,服务器会向客户端发送连接重置报文(RST)。三次握手实际上是包含4个报文,但是为了双方尽快建立连接,所以TCP将中间两个报文使用捎带应答的机制合并在一起。
四次挥手由断开连接的一方发送FIN报文,然后另一方发送ACK报文同意断开连接,但是有可能此时被断开连接的一方还要发送一些数据,等发完数据之后再给对端发送FIN报文请求断开连接。所以没有将FIN和ACK组合在一起。

  • 状态变化:
    • FIN_WAIT1:
    • FIN_WAIT2:
    • CLOSE_WAIT:一方收到FIN报文后会进入CLOSE_WAIT状态,这种状态如果不调用close关闭连接,那么会一直保持这种状态
    • LASK_ACK:被动断开连接的一方当发送FIN报文后处于的状态
    • TIME_WAIT:主动断开连接的一方等待2个MSL时间,确认等到报文被对方收到,防止下次建立连接时产生影响。在处于TIME_WAIT状态时,由于端口号被连接占用,所以导致再次启动程序时,就会报band error错误。但是对于服务器来说,这种情况是不允许发生的,我们可以设置服务器忽略TIME_WAIT状态,直接重启服务。
      • setsockopt(int sockfd, int level, int optname, const void* optval, socklen_t optlen)
        • sockfd:目标套接字
        • level:哪一层,通常填写SOL_SOCKET
        • optname:属性名,SO_REUSEADDR|SO_REUSEPORT
        • optval:填入整型变量的地址,这个变量存1
        • socklen_t:optval的实际长度
  1. 流量控制

双方通信时,会将自己接收能力设置到窗口大小中,双方就可以根据对方接收的能力选择发送报文的速度。当自己的接收缓冲区满时,就会将窗口大小设置为0,这时发送方不在发送数据,而是定期发送探测窗口,询问对方接收能力。同时如果接收方的缓冲区有空间时,接收方也会向对方发送一个窗口更新通知

  1. 拥塞控制

在发送数据时,如果出现少量丢包问题,则会触发超时重传机制。但是如果出现大量丢包,就可能是网络出现故障(网络拥塞),此时TCP就会触发慢启动机制,先减少发送量,探明网络拥塞情况,在不会加重网络拥塞的情况下,逐步增加发送量,以让网络尽快恢复正常。

  1. 拥塞窗口:衡量网络健康状态的指标

网络的状态是一直变化的,所以拥塞窗口也是一直变化的。发送开始时候,拥塞窗口大小为1,每一次收到ACK,拥塞窗口按指数级别增长。每次发送数据时,滑动窗口大小取拥塞窗口和对端接收能力的较小值。当拥塞窗口的大小超过一个阈值(ssthresh)时,按照线性增长,当发生网络拥塞时,重新设置拥塞窗口大小,阈值变为上一次探测的拥塞窗口大小的一半。
image.png

  1. 校验和&序列号

TCP效率问题:

  1. 滑动窗口

双方主机在通信时,如果收报文和发报文的顺序是串行的,那么必然通信效率不高。此时TCP引入了滑动窗口,使得在一个窗口内的数据可以并行发送。
)
那么滑动窗口是什么呢?我们知道TCP的发送缓冲区是以字节为单位的,可以看作一个大数组,滑动窗口就是这个数组里的一个子数组,数组下标即为序号。滑动窗口将发送缓冲区划分为三部分:已经收到应答的数据,可以直接发送没有收到应答,不能发送的数据区域。上层将数据放到尚未发送的区域,TCP从可以发送区域中取数据,这种模式就是生产消费模式。
image.png
滑动窗口的大小取决于网络拥塞情况和对方的接收能力(16位窗口大小),它的大小是动态变化的。当收到了X序号的应答后,滑动窗口可以向右移动到X位置处。

  1. 快重传(高速重发控制)

当发送端连续收到三个相同的确认序号时,就说明该报文已经丢失,立即触发快重传机制。快重传机制和超时重传机制会同时使用,当不满足快重传触发条件时,就会触发超时重传机制。快重传决定数据传输效率上限,而超时重传决定数据传输效率下限。

  1. 延迟应答

当接收到一个报文后,接收方等一会儿,等上层用户把数据处理一部分,以告诉对方更大的窗口大小,那么对方的滑动窗口就有可能更大,发送的数据可能会更多,借此增加了通信效率。

  • 不是所有包都延迟应答,一般每隔N个包就延迟应答一次或者超过最大延迟时间就应答一次。在不同系统中策略不同
  1. 捎带应答

在延迟应答的基础上, 我们发现, 很多情况下, 客户端服务器在应用层也是 “一发一收” 的. 意味着客户端给服务器说了 “How are you”, 服务器也会给客户端回一个 “Fine, thank you”;那么这个时候ACK就可以搭顺风车, 和服务器回应的 “Fine, thank you” 一起回给客户端 。

2.4 基于TCP协议的应用层协议
  • HTTP
  • HTTPS
  • SSH
  • Telnet
  • FTP
  • SMTP

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

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

相关文章

【学习】PyTorch中的nn.Embedding的用法

基本理解 nn.Embedding(num_embeddings, embedding_dim)其中 num_embeddings 是词表的大小,即 len(vocab);embedding_dim 是词向量的维度。 nn.Embedding()产生一个权重矩阵weight,其shape为(num_embeddings, embedding_dim&…

Java代码审计安全篇-反序列化漏洞

前言: 堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油 注意: 本文章参考qax的网络安全java代码审计和部分师傅审计思路以及webgoat靶场,记录…

Go-知识select

Go-知识select 1. select 的特性1.1 chan读写1.2 返回值1.3 default 2. select 经典使用2.1 永久阻塞2.2 快速检错2.3 限时等待 3. 实现原理3.1 数据结构3.2 实现逻辑3.3 原理总结 4. 总结4.1 大概原理4.2 参数4.3 返回值 一个小活动: https://developer.aliyun.com…

AMRT 3D 数字孪生引擎(轻量化图形引擎、GIS/BIM/3D融合引擎):智慧城市、智慧工厂、智慧建筑、智慧校园。。。

AMRT3D 一、概述 1、提供强大完整的工具链 AMRT3D包含开发引擎、资源管理、场景编辑、UI搭建、项目预览和发布等项目开发所需的全套功能,并整合了动画路径、精准测量、动态天气、视角切换和动画特效等工具。 2、轻量化技术应用与个性化定制 AMRT3D适用于快速开…

openGauss学习笔记-243 openGauss性能调优-SQL调优-典型SQL调优点-子查询调优

文章目录 openGauss学习笔记-243 openGauss性能调优-SQL调优-典型SQL调优点-子查询调优243.1 子查询调优243.1.1 子查询背景介绍243.1.2 openGauss对SubLink的优化243.1.3 更多优化示例 openGauss学习笔记-243 openGauss性能调优-SQL调优-典型SQL调优点-子查询调优 SQL调优是一…

Scala--01--简介、环境搭建

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1. Scala简介1.1 Scala是什么?官网: [https://scala-lang.org/](https://scala-lang.org/)官方文档: [https://docs.scala-lang.…

WPF布局、控件与样式

视频来源:https://www.bilibili.com/video/BV1HC4y1b76v/ 布局 常用布局属性 HorizontalAlignment:用于设置元素的水平位置VerticalAlignment:用于设置元素的垂直位置Margin:指定元素与容器的边距Height:指定元素的…

音频提取:分享几个常用方法,简单好用

有时候我们会在视频中发现一首非常好听的歌曲,但是我们并不需要视频本身。 这时,我们可以提取视频中的音频,将其转化为音频文件,然后在任何时间、任何地点进行欣赏。 下面给大家分享几个提取视频中音频的几个方法,供…

[嵌入式AI从0开始到入土]16_ffmpeg_ascend编译安装及性能测试

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注:等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

css 各种方位计算 - client系列 offset系列 scroll系列 x/y 系列

offset系列 HTMLElement.offsetTop - Web API 接口参考 | MDN 一文读懂offsetHeight/offsetLeft/offsetTop/offsetWidth/offsetParent_heightoffset-CSDN博客 client系列 搞清clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop-CSDN博客 scroll系列 秒懂scr…

RabbitMQ:1.概述及安装

概述 AMQP协议 MQ Message Queue(消息队列)是在消息的传输过程中保存消息的容器,多用于系统之间的异步通信 AMQP Advanced Message Queuing Protocol(高级消息队列协议)是一个网络协议,2006年AMQP规范发布【类比HTTP】 专门为消…

ubuntu安装zsh及环境配置

ubuntu安装zsh及环境配置 MacBook 安装 zsh 个人很喜欢使用zsh,它的终端显示很清晰,命令都很友好,使用git时,直接可以看到当前分支和修改状态 zsh安装 1.查看当前系统装了哪些shellcat /etc/shells 2.当前正在运行的是哪个版本的shellecho $SHELL 3.安装zshsudo apt-get -y …

【项目笔记】java微服务:黑马头条(day03)

文章目录 自媒体文章发布1)自媒体前后端搭建1.1)后台搭建1.2)前台搭建 2)自媒体素材管理2.1)素材上传2.2.1)需求分析2.2.2)素材管理-图片上传-表结构2.2.3)实现思路2.2.4)接口定义2.2.5)自媒体微服务集成heima-file-starter2.2.6)具体实现 2.2)素材列表查询2.2.1)接口定义2.2.2…

【Algorithm】动态规划和递归问题:动态规划和递归有什么区别?如何比较递归解决方案和它的迭代版本?

【Algorithm】动态规划和递归问题:动态规划和递归有什么区别?如何比较递归解决方案和它的迭代版本? 1. 动态规划(Dynamic Programming,DP)和递归定义及优缺点1.1 递归 (Recursion)定义及优缺点1.2 动态规划 (Dynamic Programming)定义及优缺点2. 动态规划(DP)和递归的特…

platform设备注册驱动模块的测试

一. 简介 上一篇文章编写了 platform设备注册代码,文章地址如下: 无设备树platform驱动实验:platform设备注册代码实现-CSDN博客 本文继续无设备树platform驱动实验,本文对编译好的 设备注册程序进行测试,测试所实…

Linux远程连接本地数据库(docker)

1. 安装docker 参考上一篇文章 CentOS安装Docker 2. Linux中安装Mysql 2.1 docker拉取mysql镜像 拉取镜像 docker pull mysql查看镜像列表 docker images2.2 运行mysql容器 运行一个名字为mysql的mysql容器,其连接端口号为3306,密码为123456 docker r…

运行gazebo机器人模型没有cmd_vel话题

运行赵虚左教程代码出现上诉问题 roslaunch urdf02_gazebo demo03_env.launch 原因:缺少某个包 在工作空间catkin_make编译发现报错 解决: sudo apt-get install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control 下载后再次运行launch文件…

unity学习(59)——选择角色界面--MapHandler1

map内容需要结合客户端和服务器两部分的流程: 1.客户端第一次发出的command的4,选择请求: 2.服务器做出相应: select的内容,最后就是返回当前玩家的playerModel结构体。 3.去客户端里找type 2(user2&#…

服务器数据恢复—服务器硬盘灯显示红色的数据恢复案例

服务器数据恢复环境&故障: 一台服务器中有一组由多块硬盘组建的raid阵列,在运行过程中服务器突然崩溃,管理员检查服务器发现该服务器raid阵列中有两块硬盘的指示灯显示红色。于是,管理员重启服务器,服务器重启后&a…

maven私服搭建详细教程

1、为什么需要私服 如果在公司中多个项目模块中的的公共类用的都是一样的,那么不可能将这些一样的代码写两遍。所以将其中一个项目中的代码打包成私服,然后在另外一个模块中去进行引用。 除此之外,如果大公司中开发人员较多,大家同…