第六章 传输层

思维导图:

一、 概述

与数据链路层关系

  • 提供可靠的、高效的、性价比高的数据传输
  • 输出实体
    •   
  • 传输层利用网络层的服务,为它的上层应用层提供服务
    •   

 

网络层与传输层不同点:

  • 网络层运行在由承运商操作的路由器上,因此用户无法真正控制到网络层
  • 把另一层放在网络层之上,可以让用户能够控制到服务质量(some control)
  • 传输层原语独立于网络层原语,而网络层原语会因为网络的不同而不同
    •   
  • 网络层负责把数据从源机送达到目的机(Host to Host)
  • 传输层负责把数据送达到具体的应用进程(End to End:端到端)

 

 与数据链路层关系

 

 数据段(TPDU,传输层协议数据单元)

  • TPDU(Transport Protocol Data Unit)是从传输实体发到对端传输实体的信息,有的教材叫TPDU为数据段(segment) 
  • TPDU作为数据(载荷)被封装在分组(packet)中,由网络层传输交换
  • 分组作为数据(载荷)被封装在帧(frames)中,由数据链路层传输交换

两个常用的协议:

  • UDP(User Datagram Protocol)用户数据报协议
  • TCP(Transmission Control Protocol)传输控制协议

 

二、 用户数据报协议UDP

UDP提供无连接的连接,可以使用源端口和目的端口

  • UDP数据段包括4个字段共8字节的头部和数据两个部分
  • 其中第3个字段,长度字段(域)表示;包括头部和数据总共有多少字节
  • 第4个是校验和(checksum)是可选的,如果不计算校验和,则该字段/域置为0
  • UDP数据段中最独特、最重要的字段是1、2个字段,分别表示源端口和目的端口,都是用16比特表示的

端口被分为三段:

自由端口(Free port)

  • 本地分配
  • 动态的随机端口

 UDP校验和计算:

校验和中用到的IP伪头部:(TCP协议值为6)

收到数据进行校验和计算,计算的数据里面包括收到的校验和,计算的结果应该为全1,否则传输过程中发生错误。

 

 

通信模型

端点就是套接字(Socket)

包括:

  • IP地址
  • 端口号

通信五元组:

一些著名的端口号:

传输层的PDU不仅仅送达主机,而且送达端口,即应用进程

 

三、 TCP数据段(Transmission Control Protocol)

  • TCP连接上的每个字节都有它自己独有的32位序列号
  • 单收、发双方的TCP实体不是以字节,而是以数据段的形式交换数据
    •   TCP数据段必须适合IP分组的65515字节(65535-20B)的载荷限制
    •         每个TCP数据段必须适合于下层网络的MTU

Sequence number

  • 序列号,表示一个字节的编号
  • 初始序列号ISNs(initial sequence numbers):随机产生的   

Acknowledgement number

  • 确认号,期望接收的字节编号(32位)
  • TCP的可靠传输保证,采用了肯定确认机制

 

保留字段,和控制比特

  • URG:紧急数据,即使win = 0,也可以发送。值为1时,马上处理
  • ACK:    =1,确认号有效
  • PSH:表示这是带有PUSH标志的数据,接受方收到这样的数据,应该立刻送到上层,而不需要缓存它
  • RST: 被用来重置一个已经混乱的连接,如果在连接建立阶段,就直接拒绝建立连接
  • SYN: 用在连接建立的过程

     

  • FIN:被用来释放连接,它表示发送方已经没有数据要传输了,但是可以继续接收数据

 

Window size:

  • 为了避免接收方被大量涌入的数据所淹没,TCP实体进行流控(Flow control)
  •  告诉对方可以发送的数据字节数,即从确认字节号开始,连续发送的字节总数
  • 窗口尺寸的大小,取决于接收方

Checksum(校验和):

  • 计算方法跟UDP数据段中校验和计算一样,唯一不一样的就是伪头部中的用户协议值取为6

Urgent pointer:

  • 紧急指针,和URG控制位配合使用,指明了紧急数据

Options

  • 如果有选项域,它提供了一种增加基本头没有包含的内容的方法

 

TCP三次握手

1.  建立过程

  • 一方(server)被动地等待一个进来地连接请求
  • 另一方(client)通过发送连接请求,设置一些参数
  • 服务器回发确认应答
  • 应答到达请求方,请求方最后确认,连接建立
  • 可能地安全问题:SYN泛洪Dos攻击(伪造源IP)

2.  连接释放

  • 任何一方在没有数据要传送地时候,都可以发送一个FIN置位了的TCP数据段
  • 当FIN被确认的时候,该方向的连接被关闭了
  • 当双向的连接都关闭了的时候,连接释放

 四次握手正常释放连接:

  •  

TCP传输策略

传输的是全双工的字节流

采用Window size 进行流控

策略

  • 当窗口数为0时,发送者不能正常发送数据段,除非:
  • Urgent数据。比如,用户想杀掉远端机器上的进程的时候,可以发送数据。
  • 发送者可以发送一个字节的数据段,以便让接收者再次发送期待接收的字节号(确认)窗口数(避免死锁)

优化

1.  优化接收端

  • 接收端可以推迟500ms发送确认分组和窗口更新,以便可以免费搭载在处理后的回显分组内(free ride)
  • 傻瓜窗口综合症

2.  优化发送端:Nagle's algorithm

  • 当数据以一次一字节的速度到达传输实体的时候,只发送第一个字节,然后将后续的字节缓存起来,知道发出的字节得到确认
  • 将缓存起来的字节在一个数据段中发出,在继续缓存,知道发出的数据得到确认
  • 有些情况禁用,如:互联网远程运行

 

TCP拥塞控制

拥塞检测(Congestion detection)

  • 所有的互联网TCP算法都假定超时是由拥塞引起的,并且通过监视超时的情况来判断是否出现问题

拥塞控制(Congestion control)

  • 当一个连接建立的时候,双方选择一个合适的窗口大侠,接收方根据自己的缓存区大小来指定窗口的大小
  • 如果发送者遵循这个窗口大小的限制,则接收端不会出现缓冲区溢出的问题,但可能由于网络内部的拥塞而发生问题

 

两个窗口问题

  • 要解决拥塞,应该是认识到这两个潜在的问题:网络容量、接收者容量
  • 为此,每个发送者维护两个窗口
    •  接收者窗口:反映了目前接收者的处理能力(容易获取)
    •  拥塞窗口:大小反应了网络目前的容量(难于获取)
  • 只要发送者发送的数据字节数是两个窗口中小的那个窗口数

慢启动算法(Slow Start)

  • 当连接建立的时候,发送者用当前使用的最大数据段长度初始化拥塞窗口,然后发送一个最大的数据段
  • 如果在定时器超时之前收到确认,则将拥塞窗口翻倍,然后发送两个数据段,直到超时(或达到接收方窗口的大小)

阈值开始,每次传输,线性增长

  • 不断超时,不断重启

  • 重新慢启动的时候,拥塞窗口值不用重置为一个数据段大小,而是可以设置为阈值大小,从这里直接开始线性增长,者就是所谓的快速恢复
  • 任何时候,如果TCP传输实体收到一个ICMP抑制分组(ICMP source quench),则该事件被当作超时对待

TCP定时器

  •  TCP采用了肯定确认重传技术,保证每一个字节的可靠传输
  • 每发一个数据段,都会启动一个定时器——重传定时器(retransmission timer,Positive ackn.with retransmit)
  • 持续定时器(persistence timer) 用来避免如下死锁

     

  •   保活定时器(keep-alive timer)——用来检查连接是否存活
  •   在关闭时候,处于time-wait中使用的定时器,运行两倍的最大分组生存时间,以确保连接     关闭之后,该连接上的所有数据都完全消失

 

TCP与UDP比较:

    •  

    •  TCP

      •  可靠传输方式
      •     可让应用程序简单化,程序员可以不必进行错误检查、修正等工作
    •  UDP
      •  为了降低对计算机资源的需求(如:DNS)
      •     应用程序本身已提供数据完整性的检查机制,毋须依赖传输层的协议来保证
      •     应用程序传输的并非关键性的数据(如:路由器周期性的路由信息交换)
      •     一对多方式,必须使用UDP(TCP限于一对一的传送)

转载于:https://www.cnblogs.com/zxj-262410/p/10620591.html

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

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

相关文章

Kanvas:从您的ANTLR语法生成一个简单的IDE

什么是编辑器? 对我来说,编辑器是我工作中使用的主要工具。 作为语言工程师,我创建新的语言,使用现有的语言,并且需要其他工具来使用它们。 我希望能够在一个定制的IDE中将所有这些黑客一起入侵,我可以为我…

函数名/函数地址/函数指针

转自:http://hi.baidu.com/%C6%BF%D6%D0%B5%C4%C5%AE%CE%D7/blog/item/387db9ddaa54d0a9cd1166fa.html 函数指针:1。指针变量 2。指针变量指向函数 这正如用指针变量可指向整型变量、字符型、数组一样。 在编译时,每一个函数都有一个入口地址…

matlab imaqhwinfo

使用imaqhwinfo函数,来获取电脑上安装的摄像头的名称,比如winvideo,之后可以利用imaqhwinfo(winvideo)来进一步获取设备ID等边信息,这在之后的视频流获取中会用到。获取设备ID之后(比如ID为1),可…

第二次作业--熟悉使用工具

GIT地址 https://github.com/ForeveruxGIT用户名 Foreverux学号后五位 62117博客地址 https://www.cnblogs.com/JQloveJX/ 作业链接 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/2793声明:部分内容摘自ChildishChange Part 0. 背景 阿…

什么是javax.ws.rs.core.context? [ 第2部分 ]

如何使用Context批注 在什么是javax.ws.rs.core.context? 您学习了如何使用Context批注从HttpHeaders类的注入实例中检索HTTP标头信息,以及如何从UriInfo实例中检索URI信息,例如URI参数和变量。 在本文中,您将学习如何将Context批…

【题解】Luogu P2347 砝码称重

正经DP题解 一道非常好的背包练手题( sto(注:原思路来源 SLYZ_0120 的题解)orz 开始这道题 1.输入六个数,存进数组中 2.初始化 f 数组为0。 f [ i ] 表示重量为 i 的情况是否出现过(下面代码使用的是 int 数…

matlab 获取视频图像的信息

获取视频图像的信息可以通过get函数来获取,如get(vid)或者get(getselectedsource(vid))。使用set函数可以设置摄像头获取的图像的一些属性值,也可以直接使用结构数组的“点”来赋值,比如,要持续通过摄像头获取图像,则可…

tomcat使用ssl_使用SSL和Spring Security保护Tomcat应用程序的安全

tomcat使用ssl如果您看过我的上一个博客,您会知道我列出了Spring Security可以做的十件事 。 但是,在开始认真使用Spring Security之前,您真正要做的第一件事就是确保您的Web应用使用正确的传输协议,在这种情况下为HTTPS –毕竟&a…

matlab delete、clf、cla、close、closereq删除对象

matlab中删除对象 删除对象 (1)delete:删除文件或对象图形 删除文件对象h的格式为:delete(filename)或delete filename 删除图形对象h的格式为:delete(h); 若要无条件删除所有的图形对象,则:set…

Linux系统调用过程分析

参考: 《Linux内核设计与实现》 0 摘要 linux的系统调用过程: 层次如下: 用户程序------>C库(即API):INT 0x80 ----->system_call------->系统调用服务例程-------->内核程序 先说明一下&#…

Spring Boot和应用程序上下文层次结构

Spring Boot支持一种指定Spring应用程序上下文层次结构的简单方法。 这篇文章只是演示了此功能,我尚未在我从事的项目中很好地使用它。 Spring Cloud使用此功能来创建引导上下文 ,在该上下文中,如果需要,可以从外部配置服务器加载…

drf 解析器,响应器,路由控制

解析器 作用: 根据请求头 content-type 选择对应的解析器对请求体内容进行处理。 有application/json,x-www-form-urlencoded,form-data等格式使用:局部使用:from rest_framework.parsers import JSONParser,FormParseparser_classes [JSONParser, ]全局…

matlab max与min获取矩阵最大最小值函数

1.matlab中Max的用法1(Min类似) Matlab中max函数在矩阵中求函数大小的实例如下: C max(A) 1)返回一个数组各不同维中的最大元素。 2)如果A是一个向量,max(A)返回A中的最大元素。 3)如果A是一个矩阵&…

shell中exec解析

参考:《linux命令、编辑器与shell编程》 《unix环境高级编程》exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息。 bash shell的命令分为两类:外部命…

今天敢用OSS放视频,明天阿里云就敢收你房子

关注卢松松,会经常给你分享一些我的经验和观点。 请教各位大佬:如果网站里,视频多的话,有什么加速的办法,使用CDN可以嘛? 今天群友king王咨询了这个问题:他的客户网站在美国,用美国节点的服务…

matlab meshgrid

meshgrid用于从数组a和b产生网格。生成的网格矩阵A和B大小是相同的。它也可以是更高维的。 用法: [A,B]Meshgrid(a,b) 生成size(b)Xsize(a)大小的矩阵A和B。它相当于a从一行重复增加到size(b)行,把b转置成一列再重复增加到size(a)列。因此命令等效于: …

连续锁定2个不同的锁会死锁_研究死锁–第5部分:使用显式锁定

连续锁定2个不同的锁会死锁在我的上一个博客中,我研究了使用Java的传统synchronized关键字和锁排序来修复破碎的,死锁的余额转移示例代码。 但是,有另一种方法称为显式锁定。 在这里,将锁定机制称为显式而非隐式的想法是&#xf…

fork source exec区别差异

fork 使用 fork 方式运行 script 时, 就是让 shell(parent process) 产生一个 child process 去执行该 script, 当 child process 结束后, 会返回 parent process, 但 parent process 的环境是不会因 child process 的改变而改变的. source 使用 source 方式运行 scrip…

LOJ2980 THUSC2017大魔法师(线段树+矩阵乘法)

线段树每个节点维护(A,B,C,len)向量&#xff0c;操作即是将其乘上一个矩阵。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long lo…