文章目录

  • 上课内容
    • 服务原语
  • 一、运输层的端口
      • 服务器端口号
      • 客户端端口号
    • !扩展问题:一台机器所能容纳TCP连接的数量
  • 二、用户数据报协议UDP
    • 首部字段结构
      • 伪首部
  • 三、传输控制协议TCP的基础
    • TCP连接
  • 四、TCP可靠传输的工作原理
    • 停止等待协议
      • 无差错情况与有差错情况
      • 确认丢失和确认迟到
      • 信道利用率
    • 连续ARQ协议
  • 五、TCP报文段首部格式
  • 六、TCP可靠传输的实现细节
    • 以字节为单位的滑动窗口
    • 超时重传时间选择
    • 选择确认(Selective ACK,SACK)
  • 七、TCP的流量控制
    • 利用滑动窗口实现
      • persistence timer
    • 传输效率
  • 八、TCP的拥塞控制
    • 一般原理
    • 拥塞控制方法
      • 1. 慢开始和拥塞避免
        • 1.1 慢开始算法
        • 1.2 拥塞避免算法
      • 2.快重传&快回复
      • 3. 主动队列管理AQM
  • 九、TCP的运输连接管理
    • 连接建立
      • issue
    • 连接释放

上课内容

  • 用于在不可靠网络中建立可靠链接
  • 网络层的复用,让多个应用层应用使用一个网络连接(通过端口及其相关机制区分)

服务原语

简单传输层服务的原语:

服务原语的使用:

  • TCP的socket原语(Berkeley Socket)
  • 这里的accept相当于之前的listen,

一、运输层的端口

TCP/IP端口号为16位,但其指具有本地意义,表只应用层中各个进程与运输层交互时的层间接口。

服务器端口号

两大类:

  • 系统端口号:0-1023,他们被用于一些特殊用途,一般不改动
  • 登记端口号:1024-49151 为没有系统端口号的应用程序使用。

客户端端口号

49152-65535 仅仅在酷虎进程运行时才动态选择

!扩展问题:一台机器所能容纳TCP连接的数量

  • 对于客户端机器,TCP的连接使用系统分配的端口(一般在linux为50000个左右),以及自身的ip地址决定,所以单ip地址下客户机能够建立的连接受sysctl -a | grep ip_local_port_range提供的动态端口范围限制。但docker等技术可以让客户机虚拟化多个网卡,这样就拥有了多个ip,此时最大连接数为每个容器ip地址下range大小的限制,当然也受总内存的限制
  • 对于服务端机器,TCP连接实际上是{自身ip,自身port,client ip,client port}四元组唯一决定,所以理论上其能维持的TCP连接无上限,但要维护一个连接最少需要3.3k内存,所以它维持连接数与内存有关

二、用户数据报协议UDP

特点:

  1. 无连接
  2. 尽最大努力交付
  3. 面向报文:发送方对应用程序交的报文,添加首部后就交给IP层,不合并也不拆分,保留其边界

适用场景

  • UDP没有拥塞控制,故对实时应用(电话,视频会议),可丢失但不允许大时延的场景有用
  • 支持一对一,一对多,多对一和多对多
  • 首部开销小(8byte)

首部字段结构


可以看到,首部字段时四个2字节字段:

  • 源端口
  • 目的端口
  • 长度:UDP用户数据报长度,最小是8(也即头部)
  • 检验和:检验包括头部和数据报(IP层只检验头部)是否有错,有则丢弃?

可以看到,同样的IP报,可以通过UDP实现基于端口的分用和复用

伪首部

UDP在计算checksum之前要增加12字节伪首部,如图

其中UDP长度与真正首部长度是相同的。伪首部只是临时添加的(不下传也不上交,信息是IP地址信息是应用层给的)。之后,将伪头部,真头部和数据包部分一起计算校验和。

UDP以16bit为1个checksum单位(因为校验和是16位),故当有奇数个数据字节时,会补上1个全0字节:

三、传输控制协议TCP的基础

特点

  1. TCP是面向连接的运输层协议
  2. 每一条连接只能点对点
  3. 提供可靠交付服务
  4. 提供全双工通信
  5. 面向字节流:它把应用层交下来的数据看作无结构的字节流

TCP拥有缓存,并且不关心应用程序发来报文的长度,它根据对方给出的window size当前网络拥塞程度决定一个报文段应该包含多少字节

TCP连接

TCP连接的端点是套接字(socket)。而端口号拼接到IP地址即构成了套接字

每一条TCP连接唯一地被通信两端的两个socket确定

四、TCP可靠传输的工作原理

停止等待协议

令A位发送方,B为接收方。停等协议指每发完一个分组就停止发送,等待对方的确认,收到确认后在发送下一个分组

无差错情况与有差错情况


最简单的情况是上图(a),接到了再发

如果B接受M1时出错,就扔掉分组,之后什么也不做(不通知A没收到),或者中间丢了,也是什么都不知道,相当于没通知A。一段时间后,A在超时计时器到期时没收到确认,就撤销超时计时器,并且重传M1分组,要实现这样的机制应当注意:

  • A发完分组后应当保存已发分组的副本直到其确认接受
  • 分组和确认分组需要编号
  • 显然,超时计时器重传时间要比数据在分组传输的平均时间长

确认丢失和确认迟到

对之前的出错情况,如果B的确认包传给A时丢了,A不知情,一段时间后这个分组M都会再被传过来,此时B收到了2次正确的M,它应该采取2个行动:

  1. 丢弃M不向上交付
  2. 向A发送重传确认分组

这是确认丢失的方法,情况如下:

而如果B发回去的确认包迟到了,在A重传之后才到,这是B会把第二次收到的M丢弃,并且发送重传确认分组。而A则收下迟到的分组但什么也不做。A需要等收到重发的M的确认分组之后再传之后的分组。这是确认迟到的方法
情况如下:

信道利用率

停等协议的优点是简单,但缺点是信道利用率太低
令:

  • TDT_DTD​=发送分组时间
  • RTTRTTRTT=往返时间
  • 处理分组时间忽略不计
  • TAT_ATA​=发送确认分组时间

则信道利用率为:U=TDTD+RTT+TAU=\frac{T_D}{T_D+RTT+T_A}U=TD​+RTT+TA​TD​​

为了提高效率,需要使用流水线传输的连续ARQ协议

连续ARQ协议

使用滑动窗口,是TCP协议的精髓所在,后仔细讨论

五、TCP报文段首部格式

TCP传送的数据单元是报文段,分首部和数据段。
TCP首部前20个字节是固定的,后有>=0的4N个byte的option,首段固定部分各个字段的示意图和意义如下

字段名称 字段长度 字段含义
源端口和目标端口(src/des port) 各2byte src和des的端口号
序号(Sequence Number) 4byte 其值= 真实序号%2322^{32}232,序号的编址单位是字节,整个要穿的字节流的其实序号要在连接建立时设置,而首部的需要字段值是本报文段发送数据的第一个字节的序号
确认号(ACK number) 4byte 期望收到对方下一个报文段的第一个数据字节的序号,也即期望收到下一个TCP包的Seq number。它也意味着:若ACK=N,则N-1及之前的所有数据都已经正确收到。
首部长度/数据偏移(header length) 4bit 指出TCP报文段的数据起始处距离TCP报文段的头部起始处有多远。这其实指示了TCP首部长度(因为有option,所以它是必要的)。但要注意的是,数据便宜的单位是32bit(4字节,因为option也是按这个单位增加的),这也意味着option最长不超过40bit,但其实之后的保留位也使得option有增长空间
保留位 已经减少到了4bit 留作后用
CWR(Congestion Window Reduced) 1bit 让接收者直到发送者已经减缓发送,并且可以停止发送ECN-Echo
ECE(Explicit Congestion Notation) 1bit 向接收者发送ECN-Echo信号
URG(URGent pointer) 1bit 置位时使紧急指针有效,表示报文段中有紧急数据,应尽快传送(实际上是插到队列最前面),而不要按照排队顺序(例:Ctrl+C的中断应当立刻执行)
ACK 1bit 确认号,指示确认字段。TCP规定连接建立后所有报文段ACK都应当置1
PSH(PuSH,推送) 1bit 少用。发送方把PSH置1时,接收方收到后就尽快把信息交付给接受的进程,而不必等待缓存填满
RST(ReSeT,复位) 1bit 它置位时,表示TCP连接种出现严重差错,必须释放连接后重新连接;他也用来拒绝一个非法报文段或拒接连接
SYN(同步) 1bit 用于同步序号SYN=1,ACK=0时,表示这是一个连接请求报文段,如果同意,应让ACK和SYN置位。
FIN(终止) 1bit 置位时,表明报文端发送完毕,并要求释放运输连接
窗口长度(Window size) 2byte 指发送方对应的接收窗口,表示从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。这个限制基于接收方有限的缓存空间。它是接收方让发送方设置其发送窗口的依据。
校验和(checksum) 2byte 包括首部和数据,和UDP一样要加上12byte伪头部,格式相同,但应改为TCP的协议号和对应数据
紧急指针(Urgent Pointer) 2byte 与URG通用,指出紧急数据的末尾位置(紧急数据后是普通数据),因此它也指示本报文段种紧急数据的字节数。
选项(options) 0-40byte 变长选项

六、TCP可靠传输的实现细节

以字节为单位的滑动窗口

基本示意图(A发,B接受):

如图,假定A收到了B的ACK报文段,其中window size是20(单位是byte),而确认号ack=31(表示B期望从31开始收)。这样A构造出了发送窗口。

超时重传时间选择

RTT = 收到确认时间-发出时间

使用加权的RTTsRTT_sRTTs​表示RTT,其中:
RTTs=(1−α)×oldRTTS+α×newsamRTTsRTT_s = (1-\alpha)\times oldRTT_S+\alpha \times newsamRTT_sRTTs​=(1−α)×oldRTTS​+α×newsamRTTs​,α多取0.125

超时重传时间RTO应该设置为:RTTS+4×RTTDRTT_S+4\times RTT_DRTTS​+4×RTTD​

其中RTTD是RTT偏差的加权平均值:
RTTD=(1−β)×oldRTTD+β×∣RTTS−newsamRTTS∣RTT_D = (1-\beta)\times oldRTT_D+\beta\times |RTT_S-newsamRTT_S|RTTD​=(1−β)×oldRTTD​+β×∣RTTS​−newsamRTTS​∣,β去0.25

报文每重传1次,重传时间为2倍的重传时间,不再重传时恢复上述算法

选择确认(Selective ACK,SACK)

解决收到报文只有少量未按序号/序号缺失的情况。

如果要使用SACK,就要在TCP的首部中添加允许SACK的选项。使用后可以报告收到不连续的字节块的边界,而因为首部长度限制,其最多只能生命4个字节块,SACK应用较少。

七、TCP的流量控制

利用滑动窗口实现

发送方的发送窗口不能超过接收方的接收窗口(单位为字节)

TCP窗口的单位是字节

流量控制在ACK置位时才有意义

persistence timer

当B从无空间到有空间,发送有存储空间的ACK时,如果这个包丢了,A就会一直等B发送非0窗口,B也会一直等A发数据,就会产生死锁。
为了防止这种情况,TCP设置了持续计时器,它在一方收到0窗口时开始,如到期就发送一个1byte数据,接收窗口为0的探测报文段,对方会确认这个报文段,并给出接收窗口,如果还是0意味着确实没处理完,如果不是那么僵局就可以打破了。

传输效率

发送时机选择策略:

  1. 缓存达到MSS时发
  2. 发送方应用进程进行push操作
  3. 使用timer周期性发
    Nagle算法:
    应用进程要放到TCP缓存时,先发第一个byte,收到ACK后把缓存中所有数据打包。另外如果缓存数据达到发送窗口大小/达到MSS,立即发送一个报文段

糊涂窗口综合征及其解决办法:
接收方一次处理1byte,发送方一次发1byte,这会产生极大overhead,此时可以让发送方等待,使得接收缓存有一半空闲或能容纳一个MSS,再发出ACK通知窗口大小。并且发送方也要积累接收方缓存一半/MSS的报文段。

八、TCP的拥塞控制

一般原理

拥塞控制是防止过多数据进入网络导致过载,流量控制是点对点通信量的控制

横轴输入是单位时间内输入分组,纵轴是单位时间内输出分组。

拥塞控制方法

假定:数据单方传送,接收方缓存足够,单位是一个MSS

1. 慢开始和拥塞避免

发送方维持一个拥塞窗口cwnd(congestion window)的状态变量,其取决于网络拥塞程度且动态变化,不超过2~4个SMSS(发送方最大报文段)。发送方让自己的发送窗口小于等于拥塞窗口

1.1 慢开始算法

主机发数据是从小到大逐渐增大发送窗口(事实上是cwnd数值)

通常在开始时,先把cwnd设置为1,而每收到一个对新报文段确认后,把cwnd增加1

1.2 拥塞避免算法



2.快重传&快回复

快重传:接收方应当及时发送重复确认,接收方收到3个重复确认后就重传重复确认指定的报文

快恢复:

3. 主动队列管理AQM

网络层策略对TCP拥塞空值有影响,其中影响最大的就是router分组丢弃策略。如果按照最简单的FIFO原则,叫尾部丢弃。此时TCP的发送速率将急剧下降,可能导致全局同步(大量连接速率同快同慢)。
AQM的流行方法是随机早期丢弃:

  • 平均队列长度<minthreshold,enque
  • 平均队列长度>max threshold,丢弃
  • min<平均队列长度<max,以概率p丢弃新到达分组

九、TCP的运输连接管理

连接建立


一开始,B的TCP服务器进程先创建传输控制块TCB, 准备接受客户进程的连接请求。如有,即作出响应。

A的TCP客户进程也是首先创建传输控制模块TCB。 然后 , 在打算建立TCP连接时,向B发出连接请求报文段, 这时首部中的同步位SYN = 1, 同时选择一个初始序号 seq = x。TCP规定, SYN报文段(即 SYN=1的报文段)不能携带数据, 但要消耗掉一个序号。 这时, TCP客户进程进入SYN-SENT (同步已发送)状态。

B收到连接请求报文段后, 如同意建立连接, 则向A发送确认。 在确认报文段中应把SYN位和ACK位都置1, 确认号是ack = x + 1, 同时也为自己选择一个初始序号seq = y。 请注意, 这个报文段也不能携带数据, 但同样要消耗掉一个序号。 这时 TCP服务器进程进入SYN-RCVD (同步收到)状态。

TCP客户进程收到B的确认后, 还要向B给出确认。 确认报文段的ACK置1, 确认号ack = y+ 1, 而自己的序号seq = x+1。TCP的标准规定, ACK报文段可以携带数据。 但如 果不携带数据则不消耗序号, 在这种情况下, 下一个数据报文段的序号仍是seq = x+1。这 时, TCP连接已经建立, A进入ESTABLISHED (已建立连接)状态。

当B收到A的确认后, 也进入ESTABLISHED状态。

issue

  • A为什么要最后一次确认?
    防止已失效的连接请求报文突然传送到了B。如果一个连接请求报文在长时间阻塞后(指A不在和B建立连接),B返回的确认报文A自然不会理睬,但B却认为连接已建立,耗费资源等待数据(或是自己空发数据)。

连接释放


通信双方都可释放连接。现在A和B都处于ESTABLI SHED状态。A的应用进程先向其TCP发出连接释放报文段, 并停止再发送数据, 主动关闭TCP连接。 A把连接释放报文段首部的终止控制位FIN置1, 其序号seq = u, 它等于前面已传送过的数据的最后一个字节序号+1.此时A进入FIN-WAIT-1状态,等待B确认,即便不携带数据也消耗一个信号。

B收到连接释放报文段后即发出确认, 确认号是ack = u + 1, 而这个报文段自己的序号是v,等于B之前传送的最后一个byte序号+1,之后B进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程, 因而从A到B这个方向的连接 释放了, 这时的 TCP连接处于半关闭(half-close)状态, 即A 已经没有数据要发
送了, 但B若发送数据, A仍要接收。 也就是说, 从B到A这个方向的连接并未关闭, 这个状态可能会持续一段时间。

A收到来自B的确认后, 就进入FIN-WAIT-2(终止等待2)状态, 等待B发出的连接释放报文段。

计网笔记(6) 传输层相关推荐

  1. 【考研复试】西电833/834计网笔记

    [考研复试]833/834计网笔记 分层可以带来如下好处 OSI五层模型 应用层 运输层 数据链路层 物理层 数据链路层 为什么要划分子网 局域网 虚电路服务与数据报服务的主要区别 IP层处理数据报的 ...

  2. 计算机网络笔记Part5 传输层(Transport Layer)

    本人计算机网络笔记总目录 计算机网络笔记Part1 概述 计算机网络笔记Part2 物理层(Physical Layer) 计算机网络笔记Part3 数据链路层(Data Link Layer) 计算 ...

  3. 计算机网络笔记-应用层/传输层/网络层(2w字详细整理)

    文章目录 计算机网络 计算机网络概述 互联网的组成 网络边缘部分 C/S方式 P2P对等方式 网络核心部分 电路交换 分组交换 报文交换 传输延时 计算机网络体系概述 OSI七层模型 TCP/IP四层 ...

  4. 声网自研传输层协议 AUT 的落地实践丨Dev for Dev 专栏

    本文为「Dev for Dev 专栏」系列内容,作者为声网大后端传输协议负责人 夏天. 针对实时互动应用对网络传输带来的新需求和新挑战,声网通过将实时互动中的应用层业务需求与传输策略的分层和解耦,于 ...

  5. 计网笔记:奈氏准则 香农定理

    奈氏准则 香农定理 在计网中,准确来说,在通信领域,奈氏准则和香农定理占据重要的定位. 奈氏准则 奈氏准则,又名奈奎斯特定理.该准则是指在理想低通,即无噪声,带宽受限的条件下,为了避免码间串扰,极限码 ...

  6. 【学习笔记】传输层:TCP协议(报文段、连接管理{握手}、可靠传输、流量控制、拥塞控制)

    文章目录 一. 协议特点 & 报文段 ① 特点 ② 报文段首部格式 二. TCP连接管理 ① 建立联系(三次握手) SYN洪泛攻击 ② 连接释放(四次挥手) 三. TCP流量控制 ① 序号 ② ...

  7. 【学习笔记】传输层:概述、UDP协议

    文章目录 一. 概述 1)传输层的寻址与接口 二. UDP协议 1)定义 2)首部格式 3)UDP检验 一. 概述 是主机才有的层次 两个协议:TCP & UDP TCP面向连接,UDP则不是 ...

  8. 计网笔记(一) 什么是因特网

    本文为<计算机网络-自顶向下方法>第七版 阅读笔记 1.1什么是因特网 1.1.1具体构成描述 端系统(主机) 所有连接到因特网*的设备都称为主机(host)或端系统(end system ...

  9. [ZUCC 计网]BB-quiz-数据链路层测试-2020

    问题1 PPP帧的链路最大帧长度的默认值是__A__. A.1500B B.536B C.53B D.1200B 问题2 以下关于PPP协议工作过程的描述中,错误的是___C__. A.建立PPP链路 ...

最新文章

  1. 5013.FortiGate企业级硬件防火墙Demo演示文档
  2. QT官方第三方开源工具
  3. struts2的action从request获取参数值的几种方式
  4. 《用户故事与敏捷方法》阅读笔记三
  5. 农场管理系统设计与实现php,农场农产品网站的设计与实现(PHP,MySQL)(含录像)
  6. Winform用Post方式打开IE
  7. php检测是否存在敏感词,如何用PHP+Ajax判断是否有敏感词汇
  8. Spring RestTemplate的使用示例
  9. 固定翼飞机数学建模入门(姿态角篇)
  10. word:如何将文档中的中文和英文分开
  11. MySQL8.0备份与还原工具讲解----mysqlbackup篇
  12. c# 数字转大写中文
  13. java-php-python-springboot网上摄影工作室计算机毕业设计
  14. adobe xd_如何在Adobe XD中创建Finance App UI设计
  15. 游戏《一战封神》副本星宿神殿挑战攻略
  16. 高通7x27a平台UART配置
  17. 金属基功能单体/高折射率功能单体/特种丙烯酸酯单体/特种甲基丙烯酸酯单体
  18. MySQL主从不一致的修复过程(r10笔记第96天)
  19. SaaS是什么,目前主流的国内SAAS平台提供商有哪些?
  20. ASP.NET中使用uedit遇到的坑们

热门文章

  1. 三星s6 android 5.1.1,三星S6升级安卓5.1.1系统试玩视频
  2. Apple Silicon M1 Mac如何恢复出厂设置
  3. 【前端练习】根据JSON数据页面动态形成表格
  4. 使用CameraX组件实现相机拍照
  5. 一次性提取网页中所有图片的代码
  6. BOM与DOM解释与分析
  7. java web项目中对数据库用户名密码加密的一种解决方案
  8. 云队友 | 小米最重要的两个商业启示:做对的事与找对的人
  9. 7-11 哈利·波特的考试 (25 point(s))
  10. Vue——Vue的组件化