【计算机网络 第五版】阅读笔记之五:运输层

第五章 运输层

1.运输层的功能:为应用进程之间提供端到端的逻辑通信,为应用层提供通信服务。(网络层是为主机到主机之间提供逻辑通信)

2.运输层的两个重要协议:用户数据包协议UDP和传输控制协议TCP

3.运输层的端口(协议端口号)

(1) 软件端口时是应用层的各种协议进程与运输实体进行层间交互的一种地址

(2) 服务器端口号:熟知或系统端口号0~1023,登记端口号1024~49151

(3) 客户端端口号:49151~65535 短暂端口号,仅在客户进程运行时才动态选择

4.用户数据报协议UDP

4.1 特点

  • UDP时面向无连接的,不需要建立连接就可以传输数据
  • UDP尽最大可能交付,不保证可靠交付
  • UDP是面向报文,对应用层传输的报文添加首部后就直接发送,不合并不拆分
  • UDP没有拥塞控制
  • UDP支持一对一,一对多,多对一,多对多
  • UDP首部八个字节,开销小

4.2 UDP首部格式:源端口|目的端口|长度|校验和

4.3 计算校验和:和IP数据报首部校验和一样,反码算术运算

5.传输控制协议TCP

5.1 特点:

  • TCP时面向连接的,先建立TCP连接才能传输数据,传输完成需要释放以及建立的TCP连接
  • TCP连接两个端口(套接字),点对点
  • TCP提供可靠交付
  • TCP提供全双工通信
  • TCP是面向字节流,TCP根据对方给出的窗口值和网络拥塞状况来决定一个数据报的长度,如果缓存数据太长则划分短一些再传送,如果数据太短,则等待积累更多后一起传送。

套接字socket = (IP地址:端口号) , TCP连接:: = {socket1,socket2} = {(IP1:port1),(IP2:port2)}(指两个端口的套接字)

5.2 可靠的传输原理

(1) 停止等待协议:(在不可靠的传输网络上实现可靠传输)(自动重传请求ARQ)

  • 无差错情况:A发送一个分组M1,B收到向A确认,A继续发送分组M2,依次下去….直到全部发送完。
  • 出现差错:B接受分组出现差错则直接丢弃,A没有收到确认消息,就一直等待,直到超时重传。A发送一个分组都会暂时保留这个分组的副本,为发生超时重传时使用;分组和确认分组必须编号,确认哪些收到哪些没有收到;超时计时器必须比数据在分组传输的平均往返时间更长一些。
  • 确认丢失和确认迟到:B的确认M1消息丢失了,A超时重传M1,B收到后丢弃重复的M1,重传确认M1;B的确认M1消息迟到了,A重传后也收到确认了,这个时候迟到的确认M1来了,A收到后丢弃。
  • 信道利用率:总时间 = A的发送时间TD+往返时间RTT+确认消息发送时间TA。信道利用率 = A的发送时间TD/总时间。往返时间一般远大于发送时间,故信道利用率极低

5.3 连续ARQ协议:维持一个滑动窗口,收到一个确认分组后就向前滑动窗口,发送下一个分组。

Tips:接收方不必对没有分组都进行确认,而是采取累积确认的方法,对按需到达的最后一个分组发送确认。注意这里如果中间丢失了一个分组M,接收方只能接受M前面的分组确认,发送方只能回退到丢失的M分组位置,对后面的分组再一次发送!

5.4 TCP报文的首部格式P194

5.5 TCP可靠传输的实现

(1) 以字节为单位的滑动窗口:维护一个发送窗口和接受窗口,发送窗口根据收到的确认序号不断更新发送窗口,其内部有三个指针,依次指向窗口的起始序号,窗口已发送字节尾部序号,窗口允许发送的尾部序号,这三个指针不断更新;接受窗口则按序接受数据,并发送按序接受的最高序号的确认信息。具体过程参考书中P197

(2) 超时重传时间的选择

记录每个报文的往返时间RTT,TCP保留一个加权平均往返时间RTTs。超时重传的时间RTO = RTTs+4×RTTd,RTTd为RTT的偏差的加权平均值。

Karn算法:在计算加权平均RTTs时,只要报文段重传了,就不采用其往返时间样本,这样得出的加权平均RTTs和RTO就较准确。而后提出了karn的修正方法,只要报文段重传了,就取新的重传时间为2倍的旧的重传时间。

(3) 选择确认SACK

TCP接受方收到的数据字节流不连续,通过选择确认,让发送放只重传缺少的数据,而不是重传所有没有收到确认的数据。

5.6 TCP的流量控制(让发送方的发送速率不要太快,要让接收方来得及接收)

(1) 利用滑动窗口控制流量:发送方的发送窗口不能超过接收方给出的接受窗口的数值

(2) 传输效率:TCP要控制发送缓存发送的时机来保证传输效率。

  • 缓存数据到达MSS就组成TCP报文发送出去
  • 发送方应用进程指明要求发送的报文段,用TCP支持的推送push操作
  • 发送方计时期限到了就把已有的缓存发送出去,但必须小于最长报文段长度MS
  • Nagle算法:先发送第一个字节,收到确认后再把缓存中的数据组成TCP报文发送出去
  • 解决糊涂窗口综合症:发送方不发送很小的报文段的同时,接收方也不要在缓存只有一点的时候就发送确认信息给发送方

5.7 TCP的拥塞控制

(1) 拥塞控制的概念:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载

(2) 拥塞的几种状态:

  • 轻度拥塞:当网络的吞吐量明显小于理想的吞吐量时进入轻度拥塞
  • 拥塞状态:当提供的负载达到某一数值时,网络的吞吐量反而随提供的负载的增大而下降时进入拥塞状态
  • 死锁:当提供的负载继续增大到某一数值时,网络的吞吐量就下降到零,网络已无法工作,则进入死锁

(3) 开环和闭环控制

  • 开环控制:在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞
  • 闭环控制:监测网络系统以便监测拥塞在何时何处发生;把拥塞发生的信息传送到可采取行动的地方;调整网络系统的运行以解决出现的问题

(4) 控制拥塞的方法:

  • 慢开始和拥塞避免

    慢开始:由小到大增加发送窗口和拥塞窗口(cwnd小于等于发送窗口),每次都乘以2;拥塞避免:当拥塞窗口超过慢开始门限ssthresh后,让拥塞窗口缓慢增大,即每经过一个RTT就加1(即加法增大)。如果网络发生超时,即有可能发生拥塞,就将ssthresh减小为cwnd的一半(乘法减小)。

  • 快重传和快恢复

    快重传:每收到一个失序的报文段就立即发出重复确认,使发送方及早知道有报文段没有到达对方,二不要等待自己发送数据时进行捎带;快恢复:执行乘法减小时,把ssthresh减小一半后不执行慢开始把cwnd设置为1,而是把cwnd设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法。

(5) 发送方窗口的上限值 = Min[rwnd,cwnd]

5.8 随机早期检测RED(分组丢弃策略)

(1) 尾部丢弃策略:路由器的队列满了之后,以后到达的分组就直接丢弃

(2) 维持两个参数:THmax和THmin,采用加权平均计算平均队列长度Lav,当Lav小于THmin就加入到队列,若大于THmax则直接丢弃,若大于THmin小于THmax就以概率p丢弃。

(3) 好处:当Lav超过THmin时只会有少量分组被丢弃,使得少量TCP减小其窗口值,进而使得到达路由器的分组就变少了,因此Lav减小,从而避免了网络拥塞

5.9 TCP的运输连接管理

(1) 客户和服务器:主动发起连接的叫客户,被动等待连接的叫服务器

(2) TCP的连接建立:

  • Client的TCP向Server发出连接请求报文,其首部的同步位SYN=1,序号seq = J,Client进入SYN-SENT状态
  • Server收到连接请求报文后,如果同意连接,就发送确认报文。其首部的SYN和ACK都置为1,同时选择一个序号seq = K,确认号为ACK = J+1,Server进入SYN-REVD状态,
  • Client收到Server发出的确认报文后,还要向Server发出确认报文,其首部ACK=1,确认号为K+1,序号为J+1,然后Client进入ESTABLISHED状态,即建立连接
  • Server收到Client发出的确认报文后,立即进入ESTABLISHED状态,双方可以开始传输数据

(2) TCP的连接释放:

  • Client先向其TCP发出连接释放请求,并停止发送数据。其TCP报文的首部FIN=1,序号seq=u(前一个发送数据的序号+1),这是Client进入FIN_WAIT1状态
  • Server收到Client发来的连接释放请求后,立即发出确认,确认号ack = u+1,序号seq=v,并把ACK置1,Server进入CLOSE-WAIT状态
  • Client收到确认报文后,进入FIN_WAIT2状态,等待Server发出连接释放请求
  • Server等待其数据发送完后,其应用程序就通知TCP释放连接,其首部FIN=1,ACK=1,seq=w,ack=u+1,进入LAST-ACK最后确认状态
  • Client收到Server的连接释放请求后,必须对此确认,其报文首部ACK=1,ack=w+1,seq=u+1,然后进入TIME-WAIT状态,
  • Server收到Client的确认报文后,进入CLOSED状态,Client等到2MSL后进入CLOSED状态。

Tips:为什么要等到2MSL?

答案:一是为了保证最后发出的确认报文能够到达Server,避免Server没有收到FIN+ACK报文超时重发后Client能收到并重发确认报文;二是避免已发送的连接请求报文段出现在本连接中,经过2MSL能让本连接持续的时间内所产生的所有报文都从网络中消失,在下一个连接中不会出现旧的连接请求报文。

时间: 2024-10-05 04:45:34

【计算机网络 第五版】阅读笔记之五:运输层的相关文章

【阅读笔记】计算机网络 第五版 阅读笔记(持续更新)

计算机网络 第五版阅读笔记 第一章 概述 1.因特网的组成 边缘部分:由所有连接在因特网上的主机组成 核心部分:由大量网络和连接这些网络的路由器组成 2.计算机之间的通信方式 客户服务器端方式(C/S模式):客户端是服务请求方,服务器端是服务提供方 对等方式(P2P模式):平等,对等连接通信,每一个主机既是客户又是服务器. 3.电路交换,分组交换和报文交换 3.1 电路交换:建立连接(占用通信资源)->通话(一直占用)->释放连接(释放通信资源). 优点:在通话的全部时间内,通话的两个用户始终

C++ Primer(第五版)学习笔记_3_标准模板库vector(2)

C++ Primer(第五版)学习笔记_3_标准模板库vector(2) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 6.元素的插入 insert()方法可以在vector对象的任意位置前插入一个新的元素,同时,vector自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置. 要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标. #include <iostream> #include <vector> using namespa

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 标准模板库(STL)提供三种类型的组件:容器.迭代器和算法,他们都支持泛型程序设计标准. 容器主要有两类:顺序容器和关联容器.顺序容器(vector.list.deque和string等)是一系列元素的有序集合.关联容器(set.multiset.map和multimap)包含查找元素的键值. 迭代器的作用是遍历容器. STL算法库包含四类算法:排序算法.不可变序算法.变序性算法

C++ Primer(第五版)学习笔记_2_标准模板库vector(1)

C++ Primer(第五版)学习笔记_2_标准模板库vector(1) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 向量容器vector不但能像数组一样进行随机访问,还能在尾部插入元素,完全可以替代数组. 值得注意的是,vector具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间. 容器vector的下标是从0开始的,如果vector容器的大小是n,则元素下标为0~n-1,这和数组的一样的.不一样的是,vector可以随时调整其大小. vector重要的方法有三个

C++ Primer 第五版学习笔记

<C++ Primer>第五版中文版学习笔记 ? C++ Primer 第五版学习笔记

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器 多重映照容器multimap与map结构基本相同,但由于重复键值存在,所以multimap的元素插入.删除.查找都与map的方法不相同. 1.multimap对象创建.元素插入 插入元素时,需要使用insert()方法和类似pair<string,double>("Jack", 300.5)的元素结构.可以看到,重复的元素是按照插入的先后顺序排序的. #include <iostre

C++ Primer(第五版)学习笔记_5_标准模板库string(2)

C++ Primer(第五版)学习笔记_5_标准模板库string(2) 10.搜索string对象的元素或子串 采用find()方法可查找字符串中的第一个字符元素(char, 用单引号界定)或者子串(用双引号界定):如果查到,则返回下标值(从0开始计数),如果查不到,则返回一个很大的数string:npos(即:4294967295). #include <iostream> #include <stdio.h> #include <string> using nam

C++ Primer(第五版)学习笔记_4_标准模板库string(1)

C++ Primer(第五版)学习笔记_4_标准模板库string(1) 1.创建string对象 创建一个空字符串,其长度为0 #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { string s; cout << s.length() << endl; return 0; } 运行结果: 0 2.给string对象赋值

C++ Primer(第五版)学习笔记_6_标准模板库_set集合容器

C++ Primer(第五版)学习笔记_6_标准模板库_set集合容器 Set集合容器实现了红黑树(Red-BlackTree)的平衡二叉检索树的数据结构,在插入元素时,它会自动调整二叉树的排序,把该元素放到适当的位置. (1)确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值: (2)另外,还得确保根节点左子树的高度与右子树的高度相等.这样,二叉树的高度最小,从而检索速度最快. 平衡二叉检索树的检索使用中序遍历算法,检索效率高.默认情况下,将键值由小到大遍历. 对于s

C++ Primer(第五版) 笔记 C01-02

C01 ++val; 优于 val++; 对数量不定的输入数据:while(cin>>value)... 遇到无效的输入或eof后,cin变为无效状态,条件变为假. 来自标准库的头文件用<>包围,不属于标准库的用""包围. 文件重定向工作:exename.exe <infile >outfile 点运算符:左侧运算对象是类类型的,右侧是该类型的成员. 参数 = 实参 = 值,形参指出调用函数可使用什么实参. 定义在函数内部的内置类型通常不初始化. C