计算机网络--传输层

计算机网络--计算机网络概念

计算机网络--物理层

计算机网络--数据链路层

计算机网络--网络层

计算机网络--传输层

计算机网络--应用层

1. 概述

1.1 传输层的意义

网络层可以把数据从一个主机传送到另一个主机,但是没有和进程建立联系。

传输层就是讲进程和收到的数据联系到一起,使数据能够为应用服务。

所以说传输层是主机才有的层次!

1.2 传输层的两个协议

1.3 传输层的寻址和端口

端口号只用于计算机分辨本地进程,总共有2^16=65536种端口号,端口号有很多种,不能随便使用。

1.3.1 常见的应用程序端口号

2. UDP协议

2.1 UDP概述

因为UDP一次发送一个完整报文不会分片,所以需要应用层传输过来的数据不要太大,否则网络层分片任务就很重,但是也不能太小,不然效率较低。

UDP适合一些实时应用,因为实时应用延迟要求高,需要立即响应。

2.2 UDP首部格式

2.2.1 UDP的校验位构成

这里的伪首部只是用来计算检验和的,计算完了就丢弃,可以见下UDP的校验方式。

2.2.2 UDP校验方式
总结一下步骤:
在发送端的时候:
  • 就是将每一行(4字节)拆成两部分,左右平均2字节大小,将这两字节数据写成二进制,那么2字节一共就需要2*8=16位。此时检验和没有计算,默认填充0,同时如果数据字段不整齐,则用0补齐,这样就可以写出几十行二进制数,如图中所示。
  • 计算着几十行二进制数按二进制反码运算求和,二进制反码运算可以参考二进制反码求和运算,得到的最后简介再反码,之后将反码之后的放入原来的检验和字段。
接收端的时候:
  • 与发送端的时候不同的是,此时检验和字段不是0了。
  • 按照发送端的步骤再将所有数据写成二进制进行二进制反码运算求和。
  • 如果最后得到结果全1就是没问题,否则丢弃。

3. TCP协议

3.1 TCP协议的特点

TCP必须要建立连接之后才可以进行数据交换,所以TCP是面向连接的。


TCP传输数据是随机切割数据的。

3.2 TCP报文段的首部

见上图,可以看到TCP是将数据随机分割后加上TCP头传输的,所以序号就是为了标记这些随机分割之后的数据,这里把第一个字节的编号当成序号。

确认号就是收到之后做一下标记,代表这之前的都收到了,希望收到的下一个编号的数据就是确认号打头的那个数据偏移量就是为了标记一下距离TCP开始多少字节是数据,这里的单位是4B,这个偏移量就是TCP首部长度。


窗口就是接收方告诉发送方,还有多少地方(缓存)可以放数据。

紧急指针就是告诉TCP从哪里到哪里是紧急数据。

3.2.1 TCP的六个控制位
紧急位URG

URG的特点就是让数据插队,URG=1的就会在缓存中被提前到第一个传输
 

确认位ACK

推送为PSH

就是接收端的URG,将PSH=1的数据尽快接收
注意一下,如果没有PSH,一般都是接收方缓存满了之后再将数据发送到主机

复位RST

同步位SYN

A和B主机要建立连接,就A先发一个报文,其中SYN=1
B收到之后也回复一个SYN=1的报文,代表接受连接

终止位FIN

3.3 TCP连接管理

3.3.1 TCP三次握手(建立连接)

  • 第一段的意思是

SYN=1:(A)要建立连接了!
seq=x(随机):因为还没有数据,所以写什么都无所谓

  • 第二段的意思是

SYN=1:我(B)同意你(A)建立连接!
ACK=1:连接建立了,之后的ACK必须都置为1
seq=y(随机):因为还没有数据,所以写什么都无所谓
ack=x+1:之前发送方(A)说发送的是第x位数据(虽然发送方是瞎说的),所以我(B)要的是x+1位数据

  • 第三段的意思是

SYN=0:SYN只有在建立连接时才为1,其他时候均设为0
ACK=1:连接建立了,之后的ACK必须都置为1
seq=x+1:我(A)发送的报文段的第一个字节就是x+1
ack=y+1:之前接收方(B)说发送的是第y位数据(虽然接收方是瞎说的),所以我(A)要的是y+1位数据

注意一下,TCP是双向的,所以不存在绝对不变的发送方接收方,这里的两台主机都同时是发送方和接收方。

TCP三次握手特定导致的SYN洪泛攻击

3.3.2 TCP四次挥手(连接释放)

  • 第一段的意思是

FIN=1:(A)要释放连接了!
seq=u:发了好多数据,这里只是用u指代一下,这里u是有确定值的

  • 第二段的意思是

ACK=1:连接建立了,之后的ACK必须都置为1
seq=v:发了好多数据,这里只是用v指代一下,这里v是有确定值的
ack=u+1:之前发送方(A)说发送的是第u位数据,所以我(B)要的是u+1位数据(尽管此时A已经决定释放连接了)

  • 第三段的意思是

FIN=1:(B)要释放连接了!
ACK=1:连接建立了,之后的ACK必须都置为1
seq=w:发了好多数据,这里只是用w指代一下,这里w是有确定值的
ack=u+1:之前发送方(A)说发送的是第u位数据,所以我(B)要的是u+1位数据(因为A直接不发数据了,所以第二段第三段的ack都是u+1)

  • 第四段的意思是

ACK=1:连接建立了,之后的ACK必须都置为1
seq=u+1:之前发的数据时第u位数据,B也要第u+1位数据,所以我发第u+1位数据
ack=w+1:之前发送方(B)说发送的是第w位数据,所以我(A)要的是w+1位数据

  • 为什么需要等待计时2MSL?

因为这样可以保证B可以收到A的终止报文段进而进入关闭状态。
比如说如果A的第四段报文丢失,那么等待一个MSL之后B就会重传第三段报文,花费小于1MSL之后A就会再收到第三段报文,之后就可以再次向B发送第四段报文提示B关闭连接。

3.4 TCP可靠传输

TCP是提供可靠传输,UDP这种本身还是不可靠传输的就再靠应用层解决了。

3.4.1 序号

就是TCP根据下方数据链路层的MTU(最大传输单元)来随即将数据切割成好几端并且进行编号

3.4.2 确认

发送方每一次发送数据之后都需要接收方进行确认。
TCP使用的是累计确认机制,就是从第一个丢失的字节开始请求丢失的报文段。如图中456丢失,78到达,但仍然请求发送的数据序号是4

3.4.3 重传

为什么要使用自适应算法?网络环境太复杂,路径又长又短,RTT设置短了照顾不了距离远的,RTT设置长了又导致网络利用率降低,所以使用RTTs

3.5 TCP流量控制

简单来说就是接收方可以动态的发送信息告诉发送方发送窗口的大小。
接收方接受不过来了就让发送方发送窗口小点,这样发送方发送的速率就慢下来了,接收方就有时间处理它的数据了。
接受方处理完了也可以发送请求让发送方发送窗口大点,这样发送方发送的速率就快起来了,接收方就可以处理更多数据而不是空闲等着收数据了。

3.5.1 计时器

在本例子中,使用的累计确认机制(一次回复收到ack=201)和三次流量控制机制。
但是有一个情况就是,如果最后B不允许A再发送数据了,B在处理完数据之后想要恢复窗口大小时发送的有rwnd大小的数据报丢了怎么办?此时A有B的指令在前,发送窗口为0无法发送数据,B也在等待A回复,造成了类似死锁的现象
解决方法:使用计时器

3.6 TCP拥塞控制

流量控制是对单独一个来说的,拥塞控制是一群

3.6.1 拥塞控制四种算法

这里虽然是四种算法,但是通常是两两结合进行使用

3.6.2 慢开始和拥塞避免

这里开始时以指数形式增长,ssthresh的意思是慢开始门限,代表从这个地方注入的报文段就比较多了,需要开始慢速增加了。
之后一段都是线性增长,每次增加1,直至达到网络拥塞状态
瞬间将cwnd设置为1,同时调整原来的ssthresh的值到之前达到网络拥塞状态的1/2,(这里是24降到12)
重复以上步骤,但是注意此时ssthresh变了之后线性增长的转折点也变了

3.6.3 快重传和快恢复

这里和上面的慢开始和拥塞避免的一开始步骤差不多,都是先指数增长再转变为线性增长。
不同的点是快重传和快恢复算法是在收到连续的ack确认之后执行,这里的ack就是冗余ack,冗余ack的特点是如果多次对某一段请求的数据没有被收到,达到一定数目之后就会立即执行重传。但是此时只是降到现在cwnd的一半,再重新线性增长。而不是像慢开始和拥塞避免的从头开始

4. 本章思维导图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【中间件系列】浅析redis是否适合做消息队列

文章目录 一、简单的list消息队列1.命令示例2.伪代码示例3.方案优劣 二、Pub/Sub发布订阅1.消息丢失2.消息堆积 三、相对成熟的Stream1.redis命令介绍2.多消费者组测试3.Stream会持久化吗?4.消息堆积如何解决? 总结 用redis也是比较久了,并且…

Unity3d简单对话系统的实现——使用Dialogue editor完成对话系统

目录 前言 使用方法 1.下载dialogue editor 2.新建空物体 3.对对话内容进行编辑 4.对话画布建立 5.触发对话框代码 结束语 前言 今天是坚持写博客的第21天,很高兴自己可以坚持,也希望能与大家一起进步。我们今天来看unity3d当中的一个可以轻松实…

Feign是如何发送http请求的

1、接口定义 首先,开发者使用Feign提供的注解(如FeignClient)定义接口,并在接口中定义HTTP请求的方法,这些方法将映射到远程服务的具体HTTP请求。 2、动态代理 当应用启动时,Feign会通过动态代理和反射机…

Go select 语句使用场景

1. select介绍 select 是 Go 语言中的一种控制结构,用于在多个通信操作中选择一个可执行的操作。它可以协调多个 channel 的读写操作,使得我们能够在多个 channel 中进行非阻塞的数据传输、同步和控制。 基本语法: select {case communica…

Python中的函数式编程特性深入探讨

Python中的函数式编程特性深入探讨 Python,作为一种多范式编程语言,不仅支持面向对象编程(OOP),同样也对函数式编程(FP)提供了良好的支持。函数式编程是一种编程范式,它将计算机程序看作是一系列函数的求值,并避免使用可变状态和共享状态。本文将深入探讨Python中的函…

数据赋能(112)——体系:监控数据采集——影响因素、直接作用、主要特征

影响因素 影响监控数据采集的主要影响因素如下: 采样率:采样率是指采集数据的频率。采样率决定了监控的实时性与精确度,一般来说,采样率越高,监控的实时性就越高,精确度也越高。但是,过高的采…

2024 cicsn SuperHeap

文章目录 参考沙箱存在protobuf逆向buy_booksee_bookreturn_bookedit_booksearch_book 思路exp 参考 https://hakuya.work/post/7 https://akaieurus.github.io/2024/05/20/2024%E5%9B%BD%E8%B5%9B%E5%88%9D%E8%B5%9Bpwn-wp/#SuperHeap https://blog.csdn.net/m0_63437215/art…

TSINGSEE青犀视频汇聚机房动环智能监控方案,提升机房安全稳定性

一、背景需求 在当今信息化时代,机房作为数据中心的核心设施,承载着重要的网络设备和数据存储设备,其正常运行对于企业的数据安全和业务连续性至关重要。机房内部设备众多,且运行过程中涉及大量的数据交换和传输。一旦发生安全事…

java 类加载器及双亲委派机制

1、 有哪些类加载器 还有自定义类加载器。最上面的为父加载器,加载类的路径是不一样的 2、 什么是双亲委派机制: 1. 加载时,先去找父类,父类无法加载时,在由儿子加载 3、 为什么用双亲委派: 沙箱安全&…

【devops】 Bytebase 一站式开源 数据库DevOps平台

初识 Bytebase 1、安装 安装地址 https://www.bytebase.com/docs/get-started/self-host/#docker 安装指令 docker run --init \--name bytebase \--publish 8080:8080 --pull always \--volume ~/.bytebase/data:/var/opt/bytebase \bytebase/bytebase:2.18.02、登录-dashboa…

OlSoul系统调校程序v2024.06.05

软件介绍 OlSoul是一款能够适配用于Win各个系统的系统调校软件,OlSoul内置有众多调校功能可以直接使用,如有启用无线网络功能、启用打印机功能、系统快速休眠与休眠开关、快捷方式小箭头去除功能等,具体的调校功能多达几十项,可自…

Android SplashActivity runs twice at launch on Android 13 API 33

运行写好的 Android App 到自己手机上(显示Xiaomi 23013RK75C Android 13 API 33), 通过 Logcat 发现第一次安装运行时启动页面的 onCreate 被调用两次,第一次 onCreate 函数中的 savedInstanceState 值为空,第二次不…

【Python】selenium使用find_element时解决【StaleElementReferenceException】问题的方法

StaleElementReferenceException 是 Selenium WebDriver 中的一种异常,通常在元素与当前页面的状态不同步时抛出,比如页面已经刷新或导航到另一个页面,但是尝试操作的元素引用仍然是旧页面上的元素。 以下是一些解决 StaleElementReferenceE…

RT-DETR 详解之 Efficient Hybrid Encoder

在先前的博文中,博主介绍了RT-DETR在官方代码与YOLOv8集成程序中的训练与推理过程,接下来,博主将通过代码调试的方式来梳理RT-DETR的整个过程。 整体结构 RT-DETR的代码调试大家可以参考博主这篇文章: 在梳理整个代码之前&…

几何关系运算处理

1. 判断点在线的左边还是右边 要判断一个坐标点在直线的左侧还是右侧,可以使用向量叉积。具体来说,对于给定的直线和点,我们可以计算点到直线的向量与直线的方向向量的叉积。叉积的符号可以用于判断点的位置关系: 如果叉积为正&…

SpringBoot高手之路-原理篇

文章目录 JDK动态代理 JDK动态代理

【docker】仓库、镜像、容器的关系

Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到一个可移植的容器中,并发布到任何流行的 Linux 机器上。在 Docker 的生态系统中,有几个核心概念:仓库(Repository)、镜像&#xff0…

长文预警:自动驾驶の核燃料库!Tesla数据标注系统解析

长文预警:自动驾驶の核燃料库!Tesla数据标注系统解析 前言 本文整理自原文链接,写的非常好,给了博主很多启发,投原创是因为平台机制,希望能被更多人看到。 掐指一算,又到了该学习的时间&#…

Python | Leetcode Python题解之第137题只出现一次的数字II

题目: 题解: class Solution:def singleNumber(self, nums: List[int]) -> int:a b 0for num in nums:b ~a & (b ^ num)a ~b & (a ^ num)return b

JSON及Python操作JSON相关

JSON及Python操作JSON相关 Json简介及Python操作Json相关示例。 1. JSON概念及支持的数据类型 1.1 什么是 JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解…