计算机网络传输层概念及其协议

2023-05-16

一、概念

       链路层保证的是点到点的可靠传输,传输层保证端到端的可靠性。
       传输层是进程之间的通信。
       传输实体:在收/发两端的传输层实现对等实体通信的硬件或软件。
       实现TCP协议的用户进程或者硬件称为TCP的传输实体。

二、TCP协议

1.概念

       TCP连接的性质:
       ①面向连接。
       ②全双工。
       ③Unicast(单播):只支持两端点之间的通信,不支持Multicast(多播)和Broadcast(广播)。
       ④面向字节流。

       TCP协议的端口的定义:
       ①用16bit区分2^16个端口。
       ②众所周知端口:全局分配,用于标准服务器,取值小于1024。
       ③临时端口:本地分配(主机建立连接时为用户进程动态分配的端口),取值大于1024。
       端口号用于进程寻址。
       socket通信:通过ip地址访问到目标主机,再根据端口号访问到对方主机的某个进程。

       TCP保留端口号举例:
TCP保留端口号举例
       TCP的封装:
在这里插入图片描述

2.TCP报文结构

       TCP协议报文格式:首部+应用数据
       主要看TCP首部的结构:
在这里插入图片描述
       (1)源端口号和目的端口号:分别表示TCP报文段来自于哪一个应用进程和要到目的主机的哪一个进程。
       序列号:TCP报文段是要被封装在IP分组中投递的,而IP分组在投递的过程中是有可能乱序和丢失的,为了能够使乱序和丢失的报文重传重排报文段,TCP报文必须自己给自己编号,所以序列号就是TCP报文段自己给自己的编号。

       (2)确认号:确认号是接收端的tcp实体用于向对方确认已经收到了哪一个序列号的报文而希望收到的下一个报文段的编号

       (3)偏移:TCP报文段的头部长度,以四字节为单位。例如偏移是10,则TCP报文段长度为40个字节。

       (4)标志位:6bit

       ①bit1:URG(urgent)位,当URG=1时,紧急指针域有效,为0则无效。
       紧急指针字段:16bit,存放数据部分需要被紧急处理的那一部分的最后一个字节的字节编号。

       ②bit2:ACK(acknowledge)位,当ACK=1时,确认序号有效。

       ③bit3:PSH位,在整个的TCP报文段当中,接收方在接收了多个TCP报文段时,会将TCP报文段进行缓冲,缓冲到一定长度之后才会向上交给应用层去处理,当某一个TCP报文段需要被整段的紧急处理时,很显然它不希望被缓冲在接收方的缓冲区里,这时候它就将它的PSH位置1,这时接收方在收到了这个TCP报文段时,就不用等到缓冲区满才将它上传给它的上一层应用程序。

       ④bit4:RST位,用于当连接崩溃或出现错误连接时用于连接复位。

       ⑤bit5:SYN位,即同步比特,同于建立连接时使用(三次握手),为1表示请求建立连接,如果对方同意建立连接,就会也返回一个SYN=1的TCP报文段,如果对方不同意建立连接,就返回SYN=1,ACK=0的TCP报文段,这样接收方就可以区分发送方是否请求与她建立了连接,发送方也可以确认接收方是否同意与她建立连接。

       ⑥bit6:FIN位,断开连接时使用(四次挥手),发送方发送FIN=0的TCP报文段表示请求断开连接,接收方如果同意断开连接也向发送方发送FIN=0的TCP报文段,如果接收方不同意,则发送FIN=0的TCP报文段。

       ⑦窗口字段:接收端向发送端发送的用于控制发送端的发送的报文段的尺寸,防止接收端的缓冲区溢出(结合滑动窗口理解)

       ⑧校验和字段:对整个TCP报文段进行校验。

3.TCP的流量控制和拥塞控制

       (1)滑动窗口进行流量控制

       TCP通过滑动窗口进行流量控制,即发送端可以连续发送走多个TCP报文段,只要是在TCP发送窗口当中的都可以发送走。接收端也有一个接收窗口,只有在接收窗口中的TCP报文段接收方才会成功接收并且返回ACK给发送方,这样发送端就可以确认这一报文段已经被成功接收,那么已经被ACK过的报文段就可以出发送窗口,使得发送窗口继续向下滑动了。
在这里插入图片描述

       (2)TCP的拥塞控制

       当TCP报文段传输的过程中产生拥塞时,我们希望发送端减少或减缓发送,使得发送压力不是那么大,具体的做法可以使用TCP的拥塞控制:

       在发送方设定一个拥塞窗口(cwnd),拥塞窗口的初值等于发送窗口(swnd)的大小,在一个超时计时器时间内,最多能够发送的报文段的多少就由拥塞窗口决定。再设定一个阈值(ssthresh),用于控制拥塞窗口的大小,拥塞窗口的大小应该小于等于这个阈值。

       当cwnd<ssthresh时,若每一个RTT(往返时延)内,都能正确接收报文,cwnd加倍(慢开始)。若超时,说明出现拥塞,启动拥塞避免算法。
       当cwnd>ssthresh时,每经过RTT,若能正确接收报文,cwnd加1(拥塞避免)。
       当cwnd=ssthresh时,每经过RTT,若能正确接收报文,cwnd加倍也可以,加1也可以(即慢开始和拥塞避免都可以)。

       TCP拥塞控制包括四个核心算法:慢开始,拥塞避免,快重传和快恢复。
       慢开始的主要思想:一开始不发送大量的数据,而是从小到大的逐渐增加拥塞窗口的大小,从而试探网络的拥塞程度。
       拥塞避免的主要思想:即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加 1。
       快重传的思想:接收方收到一个失序的报文段就立即出发重复确认,发送方连续收到3个重复确认就立即重传对方尚未收到的报文段,而不用等重传计时器的时间。
       快恢复的思想:发送方收到3个重传确认时,立即执行“乘法减小”算法,即ssthresh门限减半(1/2)。接下来,并不执行慢开始算法(cwind置1),而是将cwnd置为ssthresh,然后执行拥塞避免算法。

       拥塞控制的例子:
在这里插入图片描述
       当TCP连接进行初始化时,把拥塞窗口cwnd置为1.为了便于理解,图中的窗口单位不使用字节而使用报文段的个数。在本例中,慢开始门限的初始值设置为16个报文段,即ssthresh=16.。在执行慢开始算法时,发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值加1,然后开始下一轮的传输(上图中横坐标是传输轮次,不是时间)。因此拥塞窗口cwnd随着传输轮次按指数规律增长。当拥塞窗口cwnd增长到慢开始门限值ssthresh时(图中点①,此时拥塞窗口cwnd=16),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。但是“拥塞避免”并非完全能够避免拥塞。“拥塞避免”是说把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
       当拥塞窗口cwnd=24时,网络出现了超时(图中的点②),发送方判断为网络拥塞。于是调整门限值ssthresh = cwnd/2=12,同时设置拥塞窗口cwnd=1,进入慢开始阶段。
       按照慢开始算法,发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值加1。当拥塞窗口cwnd=ssthresh=12时(图中的点③,这是新的ssthresh值),改为执行拥塞避免算法,拥塞窗口按线性增大。
当拥塞窗口cwnd=16时(图中的点④),出现了一个新的情况,就是发送方一连收到3个对同一个报文段的重复确认(图中的3-ACK)。关于这个问题要解释下:
       有时,个别报文段会在网络中丢失,但实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞。这就导致发送方错误地启动慢开始,把拥塞窗口cwnd又设置为1,因而降低了传输效率。所以采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。

       因此,在上图中的点④,发送方知道现在只是丢失了个别的报文段。于是不启动慢开始,而是执行快恢复算法。这时,发送方调整门限值ssthresh=cwnd/2=8,同时设置拥塞窗口cwnd=ssthresh=8(图中点⑤),并开始执行拥塞避免算法。

       TCP Reno是快恢复算法,TCP Tahao是慢开始算法。

TCP拥塞控制流程图

       关于TCP协议的三次握手和四次挥手就不再记录了,网上有好多非常好的文章。这篇记录传输层的文章写的让人看起来不怎么赏心悦目,以后有时间在改改,补补。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机网络传输层概念及其协议 的相关文章

  • RPlidar(一)——雷达试用

    先附一张RPlidar的图片 以下为本人初次通过ubuntu使用RPlidar 首先将RPlidar连接到电脑上 然后在terminal输入 ls dev ttyUSB 更改com port 权限 sudo chmod 666 dev tt
  • RPlidar学习(三)——RPlidar源代码库

    1 头文件简介 rplidar h 一般情况下开发的项目中仅需要引入该头文件即可使用 RPLIDAR SDK 的所有功能 rptypes h 平台无关的结构和常量定义 rplidar protocol h 定义了 RPLIDAR 通讯协议文
  • PC读写西门子PLC寄存器的值

    https blog csdn net weixin 29482793 article details 81873280
  • 编码的历史

    快下班时 xff0c 爱问问题的小朋友Nico又问了一个问题 xff1a 34 sqlserver里面有char和nchar xff0c 那个n据说是指unicode的数据 xff0c 这个是什么意思 34 并不是所有简单的问题都很容易回答
  • 教你如何通过MCU配置S2E为TCP Server的工作模式

    在上一篇文章中讲了 如何通过MCU配置S2E为UDP模式 xff0c 相信小伙伴们已经了解了S2E的基本功能 xff0c 在这一篇中 xff0c 我们再接再厉 xff0c 继续学习一下 如何通过MCU配置S2E为TCP Server的工作模
  • ubuntu配置USB权限

    usbcan设备在ubutu下使用 xff0c 每次必须动用root权限才能使用 xff0c 比较繁琐 参考如下文章进行配置 xff1a https blog csdn net bigdog 1027 article details 790
  • SocketCAN学习笔记

    1 对SocketCAN的理解 69条消息 对Socket CAN的理解 xff08 1 xff09 CAN总线原理 yuzeze的博客 CSDN博客 can socket 对Socket CAN的理解 xff08 2 xff09 Sock
  • Golang写Post请求并获取返回值

    直接上代码 xff0c 其中可以在下面代码中添加 package main import fmt net http io ioutil net url func main 需要post的数据 以key value形式提交 data 61 m
  • postMan 汉化

    1 下载postman解压安装 xff0c 下载地址Postman 2 下载汉化包 Release 9 2 0 hlmd Postman cn GitHub 选择postMan对应的版本 3 找到postman根目录我的在c盘 xff0c
  • 2022 小学组试题

    1 史密斯数 若一个合数的质因数分解式逐为位相加之和等于其本身逐位相加之和 则称这个数为smith数 如4937775 3 5 5 65837 而3 5 5 6 5 8 3 7 42 4 9 3 7 7 7 5 42 所以4937775是s
  • usaco 1 回文素数快速筛选

    求指定区间的回文素数 include lt bits stdc 43 43 h gt define N 10000010 using namespace std bool st N int cnt 61 0 primes N n m voi
  • C++ STL 学习笔记

    MAP的用法 xff1a 389找不同 给定两个字符串 s 和 t xff0c 它们只包含小写字母 字符串 t 由字符串 s 随机重排 xff0c 然后在随机位置添加一个字母 请找出在 t 中被添加的字母 示例 输入 xff1a s 61
  • 大模型平台

    大模型训练平台的算力急速增长 xff1a 据报道 xff0c GPT3 5 的训练使用了微软专门建设的 AI 计算系统 xff0c 由 1 万个 V100 GPU 组成的高性能网络集群 xff0c 总算力消耗约 3640 PF days 即
  • Float IP 浮动IP地址

    xfeff xfeff 就是多个主机工作在 同一个集群中 xff0c 即两台主机以上 每台机器除了自己的实IP外 xff0c 会设置一个浮动IP xff0c 浮动IP与主机的服务 xff08 HTTP服务 邮箱服务 xff09 绑在一起的
  • linux 下安装 c++编译器的方法

    xfeff xfeff 假设你的电脑能够访问internet xff0c 这个命令会自动从网络下载并把软件安装到本地 超级用户权限 xff1a yum y install gcc c 43 43 另外一定不要天真的认为linux 下面 编译
  • linux 内核编译错误的原因

    xfeff xfeff 直接编译centos 7 内核目录下的代码出现如下错误 xff1a root 64 localhost 3 10 0 123 el7 x86 64 make make 1 No rule to make target
  • ifconfig 看到Rx error overrun 如何解决

    xfeff xfeff 一台机器经常收到丢包的报警 xff0c 先看看最底层的有没有问题 ethtool em2 egrep 39 Speed Duplex 39 Speed 1000Mb s Duplex Full ethtool S e
  • AES-GCM算法

    AES GCM算法简介 AES GCM算法是带认证和加密的算法 xff0c 同时可以对给定的原文 xff0c 生成加密数据和认证码 参数如下 xff1a 1 xff09 带加密的原文 2 xff09 存储加密后密文 3 xff09 IV向量
  • cmake 编译c++项目

    分两步 xff1a CMakeLists txt文件编写结束以后就可以对工程进行编译了 xff0c 进入build目录 并执行cmake和make指令 xff0c 如下 xff1a 第一步 cmake span class token pu

随机推荐

  • sshd 无法启用的问题 Could not load host key: /etc/ssh/ssh_host_rsa_key Could not load host key: /etc/ssh/ss

    原文链接 xff1a http blog csdn net lynn kong article details 9112009 1 问题现象 版本 xff1a Grizzly master分支代码2013 06 17 部署 xff1a 三个
  • iptables nat

    NAT一般情况下分为SNAT xff0c DNAT和PNAT 此篇主要讲述的是使用iptables配置NAT xff0c 所以这3种NAT的区别和应用场景就简单的说明一下 SNAT xff1a 源地址转换 目标地址不变 xff0c 重新改写
  • Qt 的Cmake方式如何创建资源文件和添加类

    今天看到有人问Qt 的Cmake方式如何创建资源文件 xff0c 这个问题和添加类都是一样的 xff0c 也有朋友问如何添加类 xff0c 百度的回答是把cmake改成Qmake 这样等于没有回答 xff0c 根据自己的经验我在这里回答一下
  • ajax 请求头Authorization 添加账号密码访问

    在header中添加 34 Authorization 34 字段 xff0c 值为 34 api key api secret 34 进行base64加密后 在前面加入 34 Basic 34 Basic后有空格 字符串 最后形式为 34
  • Authorization—权限控制流程

    本篇是对Shiro体系架构的介绍 xff0c 本栏目大部分内容来自于Shiro官网 翻译过程中已经尽量保证用词的准确性和易懂性 xff0c 如有不准确或者不确切的地方 xff0c 请联系作者加以修改 本篇内容翻译自Authorization
  • C语言在头文件中用extern架起变量沟通的桥梁

    span class hljs comment a c span span class hljs keyword int span foo span class hljs keyword int span bar span class hl
  • 【C语言】5. 指针free后为什么要刻意指向NULL、野指针(原因、解决)、悬垂指针

    目录 1 指针free后为什么还要刻意指向NULL xff1f 2 野指针2 1 什么是野指针 xff1f 2 2 野指针形成的原因2 3 如何避免野指针 3 悬垂指针3 1 什么是悬垂指针 xff1f 3 2 示例代码3 3 解决方法 1
  • 【QT】UDP通信QUdpSocket(单播、广播、组播)

    目录 1 UDP通信概述2 UDP消息传送的三种模式3 QUdpSocket类的接口函数4 UDP单播和广播代码示例4 1 测试说明4 2 MainWindow h4 3 MainWindow cpp4 4 界面展示 5 UDP组播代码示例
  • Fiddler 调试HTTP工具,帮助Debug HTTP连接的免费工具

    Fiddler是一个C 实现的浏览器抓包和调试工具 xff0c fiddler启用后作为一个proxy存在于浏览器和服务器之间 xff0c 从中监测浏览器与服务器之间的http https级别的网络交互 目前可以支持各种主要浏览器如IE C
  • 对话框使用VIEW (转)

    现在的程序功能越来越复杂 xff0c 很多功能要求能在对话框中实现复杂的功能 xff0c 而在对话框中使用视图不像使用一些诸如静态控件 xff0c 编辑控件等那么方便 xff0c 下面文章用实例说明如何在对话框中使用视图 正文 http w
  • ubuntu系统下安装putty

    1 打开终端 xff0c 使用下面的命令来安装putty xff1a 1 1 sudo apt get update 1 2 sudo apt get install putty 上面两步成功则说明putty安装成功 2 接下来配置putt
  • 改变linux shell的输出效果

    文本终端的颜色可以使用 ANSI非常规字符序列 来生成 举例 xff1a echo e 34 033 44 37 5m ME 033 0m COOL 34 以上命令设置背景成为蓝色 xff0c 前景白色 xff0c 闪烁光标 xff0c 输
  • GNU ARM 汇编指令

    原文地址 http blog sina com cn s blog 59b189220100au1k html 第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C 43 43 编写程序很方便 xff0c 但汇编源程序用于系统最
  • 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决?

    什么是序列化 序列化 xff1a 把对象转换为字节序列的过程称为对象的序列化 反序列化 xff1a 把字节序列恢复为对象的过程称为对象的反序列化 怎么序列化 实现Serializable接口 xff0c 指定serialVersionUID
  • 寻迹小车笔记——红外对管(TCRT5000)原理

    一 概述 深色 xff08 黑色 xff09 的是发射端 xff0c 白色 xff08 透明 xff09 的是接收端 中间蓝色的是可以调节灵敏度的旋钮 TCRT5000光电传感器模块是基于TCRT5000红外光电传感器设计的一款红外反射式光
  • C语言判断一个数是否是水仙花数

    水仙花数是指一个N位正整数 xff08 N 3 xff09 xff0c 它的每个位上的数字的N次幂之和等于它本身 例如 xff1a 153 61 1 3 43 5 3 43 3 3 include lt stdio h gt int nar
  • C语言分类统计字符个数

    题目来源 xff1a 分类统计字符个数 PTA 本题要求实现一个函数 xff0c 统计给定字符串中英文字母 空格或回车 数字字符和其他字符的个数 函数接口定义 xff1a void StringCount char s 其中 char s
  • MIPS单周期CPU的设计——I型指令的设计

    一 一些概念 1 单周期CPU 指令周期 xff1a CPU从内存取出一条指令并执行这条指令的时间总和 CPU周期 xff1a 又称机器周期 xff0c CPU访问一次内存所花的时间较长 xff0c 因此用从内存读取一条指令字的最短时间来定
  • MIPS单周期CPU设计——lw和sw指令的设计

    1 lw xff0c sw指令格式及功能 指令 31 26 25 21 20 16 15 0 意义lw100011rsrtoffset从数存 xff08 数据存储器 xff09 中取数据写进寄存器sw101011rsrtoffset将寄存器
  • 计算机网络传输层概念及其协议

    一 概念 链路层保证的是点到点的可靠传输 xff0c 传输层保证端到端的可靠性 传输层是进程之间的通信 传输实体 xff1a 在收 发两端的传输层实现对等实体通信的硬件或软件 实现TCP协议的用户进程或者硬件称为TCP的传输实体 二 TCP