概述
感兴趣的朋友可以去我的语雀平台进行查看更多的知识。
https://www.yuque.com/books/share/ffbf2b86-52af-4a4f-b144-507a890fb8dc?# 《木子Teng的计算机知识库》
5. 传输层
5.1 传输层提供的服务
5.1.1 ????传输层提供的服务及功能概述
传输层的功能如下:
- 传输层提供应用进程之间的逻辑通信(即端到端的通信)。
- 与网络层的区别是,网络层提供的是主机之间的逻辑通信。
- 从网络层来说,通信的双方是两台主机,IP 数据报的首部给出了这两台主机的IP地址。
- 但“两台主机之间的通信”实际上是两台主机中的应用进程之间的通信,应用进程之间的通信又称
端到端
的逻辑通信。 - 这里
“逻辑通信”
的意思是:传输层之间的通信好像是沿水平方向传送数据,但事实上这两个传输层之间并没有–条水平方向的物理连接。
- 复用和分用。
- 复用是指发送方不同的应用进程都可使用同一个传输层协议传送数据;
- 分用是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程。
注意:
- 传输层的复用分用功能与网络层的复用分用功能不同。
- 网络层的
复用
是指发送方不同协议的数据都可以封装成IP数据报发送出去。 - 网络层的
分用
是指接收方的网络层在剥去首部后把数据交付给相应的协议。
- 传输层还要对收到的报文进行差错检测(首部和数据部分)
- 网络层只检查IP数据报的首部,不检验数据部分是否出错。
- 提供两种不同的传输协议,即面向连接的TCP和无连接的UDP
- 网络层无法同时实现两种协议(即在网络层要么只提供面向连接的服务,如虚电路;要么只提供无连接服务,如数据报,而不可能在网络层同时存在这两种方式)。
5.1.2 ????传输层的寻址与端口
5.1.2.1 端口的作用
- 端口能够让应用层的各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。
- 端口是传输层
服务访问点
(SAP),它在传输层的作用类似于IP地址在网络层的作用或MAC地址在数据链路层的作用,只不过IP地址和MAC地址标识的是主机,而端口标识的是主机中的应用进程
。 数据链路层的SAP是MAC地址,网络层的SAP是IP地址,传输层的SAP是端口
。- 在协议栈层间的抽象的协议端口是软件端口,它与路由器或交换机上的硬件端口是完全不同的概念。
- 硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与传输实体进行层间交互的一种地址。
- 传输层使用的是软件端口。
5.1.2.2 端口号的分类
5.1.2.3 套接字
在网络中通过IP地址来标识和区别不同的主机,通过端口号来标识和区分一台主机中的不同应用进程
。在网络中采用发送方和接收方的套接字
(Socket)
组合来识别端点
。
5.1.3 无连接UDP和面向连接TCP服务
5.2 ????UDP协议
5.2.1 用户数据报协议UDP概述及特点优势
为什么应用开发人员宁愿在UDP之上构建应用,也不选择TCP?既然TCP提供可靠的服务,而UDP不提供,那么TCP总是首选吗?
答案是否定的,因为有很多应用更适合用UDP,主要是因为UDP具有如下优点:
- UDP无须建立连接
- UDP不会引入建立连接的时延。
- 试想如果DNS运行在TCP而非UDP.上,那么DNS的
速度
会慢很多。 - HTTP使用TCP而非UDP,是因为对于基于文本数据的Web网页来说,
可靠性
是至关重要的。
- 无连接状态
- TCP需要在端系统中维护连接状态。此连接状态包括接收和发送缓存、拥塞控制参数和序号与确认号的参数。
- 而UDP不维护连接状态,也不跟踪这些参数。
- 因此,
某些专用应用服务器使用UDP
时,一般都能支持更多的活动客户机
。
- 分组首部开销小。
TCP
有20B
的首部
开销,而UDP
仅有8B
的开销。
- 应用层能更好地控制要发送的数据和发送时间。
- UDP没有拥塞控制,因此网络中的拥塞
不会影响主机的发送效率
。 某些实时应用要求以稳定的速度发送
,能容忍一些数据的丢失,但不允许有较大的时延
,而UDP正好满足这些应用的需求。
- UDP常用于一次性传输较少数据的网络应用
- 如DNS、SNMP等,因为对于这些应用,若采用TCP,则将为连接创建、维护和拆除带来不小的开销。
- UDP也常用于多媒体应用(如IP电话、实时视频会议、流媒体等),显然,可靠数据传输对这些应用来说并不是最重要的,但TCP的拥塞控制会导致数据出现较大的延迟,这是它们不可容忍的。
- UDP提供尽最大努力的交付,即不保证可靠交付
- 但这并不意味着应用对数据的要求是不可靠的,因此所有维护传输可靠性的工作需要用户在应用层来完成。
应用实体可以根据应用的需求来灵活设计自己的可靠性机制
。
- UDP是面向报文的。
- 发送方UDP对
应用层交下来的报文
,在添加首部后就向下交付给IP层,既不合并,也不拆分
,而是保留这些报文的边界; - 接收方UDP对IP层交上来UDP用户数据报,在去除首部后就原封不动地交付给上层应用进程,一次交付一个完整的报文。
- 因此
报文不可分割,是UDP数据报处理的最小单位
。
5.2.2 UDP首部格式
各字段意义如下:
- 源端口。源端口号。在需要对方回信时选用,不需要时可用全0。
- 目的端口。目的端口号。这在终点交付报文时必须使用到。
- 长度。UDP数据报的长度(包括首部和数据),其最小值是8 (仅有首部)。
- 校验和。检测UDP数据报在传输中是否有错。有错就丢弃。该字段是可选的,当源主机不想计算校验和时,则直接令该字段为全0。
5.2.3 当传输层从IP层收到UDP数据报时
根据首部中的目的端口,把UDP数据报通过相应的端口上交给应用进程
如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于端口号的应用进程),那么就丢弃该报文,并由ICMP发送“端口不
可达”差错报文给发送方
。
5.2.4 UDP校验
伪首部和全0字节是不发送的,仅供校验使用
5.3 ????TCP协议
5.3.1 TCP协议
5.3.1.1 TCP协议的特点
5.3.1.2 TCP报文段的首部格式
TCP传送的数据单元称为报文段
。一个TCP报文段分为TCP首部和TCP数据两部分,整个TCP报文段作为IP数据报的数据部分封装在IP数据报中- 其首部的前20B是固定的。TCP报文段的首部最短为20B,后面有4N字节是根据需要而增加的选项,通常长度为4B的整数倍。
- TCP报文段既可以用来运载数据,又可以用来建立连接、释放连接和应答。
源端口和目的端口字段
。各占2B。端口是运输层与应用层的服务接口,运输层的复用和分用功能都要通过端口实现。序号字段
。占4B。TCP是面向字节流的(即TCP传送时是逐个字节传送的),所以TCP连接传送的数据流中的每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。
确认号字段
。占4B,是期望收到对方的下一个报文段的数据的第一个字节的序号。若确认号为N,则表明到序号N- 1为止的所有数据都已正确收到。
数据偏移(即首部长度)
。占4位,这里不是IP数据报分片的那个数据偏移,而是表示首部长度,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。“数据偏移”的单位是32位(以4B为计算单位)。因此当此字段的值为15时,达到TCP首部的最大长度60B
保留字段
。占6位,保留为今后使用,但目前应置为0,该字段可以忽略不计。紧急位URG
。URG=1时,表明紧急指针字段有效。它告诉系统报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。但URG需要和紧急指针配套使用
,即数据从第一个字节到紧急指针所指字节
就是紧急数据
。
确认位ACK
。只有当ACK= 1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1.推送位PSH (Push)
。 接收TCP收到PSH= 1的报文段,就尽快地交付给接收应用进程而不再等到整个缓存都填满后再向上交付。
-
复位位RST (Reset)
。RST=1时,表明TCP连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。 -
同步位SYN
。同步SYN= 1表示这是一个连接请求或连接接收报文
。当SYN=1, ACK=0
时,表明这是一个连接请求
报文,对方若同意建立连接,则在响应报文中使用SYN=1, ACK=1
。即SYN=1表示这是一个连接请求或连接接收报文。 -
终止位FIN (Finish)
。用来释放一个连接。FIN= 1表明此报文段的发送方的数据已发送完毕,并要求释放传输连接。 -
窗口字段
。占2B。它指出现在允许对方发送的数据量,接收方的数据缓存空间是有限的,因此用窗口值作为接收方让发送方设置其发送窗口的依据,单位为字节。例如,假设确认号是701,窗口字段是1000。这表明,从701号算起,发送此报文段的接收方方还有接收1000B数据(字节序号为701 ~1700)的接收缓存空间。
校验和
。占2B。校验和字段检验的范围包括首部和数据两部分。在计算校验和时,和UDP一样,要在TCP报文段的前面加上12B的伪首部(只需将UDP伪首部的第4个字段,即协议字段的17改成6,其他的和UDP一样)。紧急指针字段
。占16 位,指出在本报文段中紧急数据共有多少字节(紧急数据放在本报文段数据的最前面)。
选项字段
。长度可变。TCP最初只规定了一种选项,即最大报文段长度(Maximum SegmentSize,MSS)。MSS是TCP报文段中的数据字段的最大长度。窗口扩大、时间戳、选择确认填充字段
。这是为了使整个首部长度是4B的整数倍。填充0。
5.3.1.3 TCP连接管理
- TCP是面向连接的协议,因此每个TCP连接都有三个阶段:
连接建立、数据传送和连接释放
。 TCP连接的管理就是使运输连接的建立和释放都能正常进行
。
在TCP连接建立的过程中,要解决以下三个问题:
- 要使每一方都能够确知对方的存在。
- 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项、时间戳选项及服务质量等)。
- 能够对运输实体资源( 如缓存大小、连接表中的项目等)进行分配。
每条TCP连接通过通信两端的两个端点( 即两个套接字)
确定。
连接的建立—三次握手
- seq为序号字段,标明本次报文段数据部分的第一个字节的序号
- ack是
确认号字段
,告诉对方我接下来应该接收的数据是从字节序号ack开始的数据 - ACK是确认位,0时
确认号字段ack
无效,1时确认号字段ack
有效 - SYN是同步位
TCP提供的是全双工通信,因此通信双方的应用进程在任何时候都能发送数据。
服务器端的资源是在完成第二次握手时分配的
而客户端的资源是在完成第三次握手时分配的,这就使得服务器易于受到SYN洪泛攻击。
SYN泛洪攻击
5.3.1.4 TCP连接释放—四次挥手
- 第一步:客户机打算关闭连接时,向其TCP发送一个连接释放报文段, 并停止发送数据,主动关闭TCP连接,该报文段的FIN标志位被置1,
seq=u, 它等于前面已传送过的数据的最后一个字节的序号加1
(FIN报文段即使不携带数据,也要消耗一个序号)。
TCP 是全双工的,即可以想象为一条TCP连接上有两条数据通路。
发送FIN报文时,发送FIN的一端不能再发送数据,即关闭了其中一条数据通路,但对方还可以发送数据。 - 第二步:服务器收到连接释放报文段后即发出确认,
确认号是ack=u+ 1,而这个报文段自己的序号是v,等于它前面已传送过的数据的最后一个字节的序号加1
。
此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。
但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭
。 - 第三步:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时其
发出FIN= 1的连接释放报文段
。 - 第四步:
客户机收到连接释放报文段后,必须发出确认
。在确认报文段中,ACK字段被置为1,确认号ack=w+1,序号seq=u+1.此时TCP连接还未释放,必须经过时间等待计时器设置的时间2MSL后,A才进入连接关闭状态
。
5.3.1.5 TCP连接建立和释放的总结
- 连接建立。分为3步:
- SYN=1,seq=x。
- SYN=1, ACK=1, seq=y, ack=x+ 1。
- ACK=1,seq=x+1, ack=y+ 1。
- 释放连接。分为4步:
- FIN=1, seq= u。
- ACK=1, seq=v, ack=u+1。
- FIN=1,ACK=1, seq=w,ack=u+1。
- ACK=1, seq=u+1, ack=w+1。
关于连接和释放,ACK、SYN、FIN一定等于1。
5.3.2 TCP可靠传输
5.3.2.1 TCP可靠传输简介
5.3.2.2 序号
5.3.2.3 确认
5.3.2.4 重传
5.3.3 TCP流量控制
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口rwnd
, 即调整TCP报文段首部中的“窗口”字段值
,来限制发送方向网络注入报文的速率。
同时,发送方根据其对当前网络拥塞程序的估计而确定的窗口值,这称为拥塞窗口cwnd
,其大小与网络的带宽和时延密切相关。
例如
,在通信中,有效数据只从A发往B,而B仅向A发送确认报文,这时B可以通过设置确认报文段首部的窗口字段来将rwnd通知给A。
rwnd 即接收方允许连续接收的最大能力,单位是字节。
发送方A总是根据最新收到的rwnd值来限制自己发送窗口的大小,从而将未确认的数据量控制在rwnd大小之内,保证A不会使B的接收缓存溢出。
当然,A的发送窗口的实际大小取rwnd和cwnd中的最小值
。
TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。
若持续计时器设置的时间到期,就发送一个零窗口探测报文段 。接收方收到探测报文段时给出现在的窗口值。
若窗口仍然是0,那么发送方就重新设置持续计时器。
传输层和数据链路层的流量控制的区别是:
- 传输层定义
端到端
用户之间的流量控制,数据链路层定义两个中间的相邻结点
的流量控制。 - 另外,
数据链路层
的滑动窗口协议的窗口
大小不能动态变化
,传输层
的则可以动态变化
。
5.3.4 TCP拥塞控制
5.3.4.1 定义
所谓拥塞控制,是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载
。出现拥塞时,端点并不了解到拥塞发生的细节,对通信连
接的端点来说,拥塞往往表现为通信时延的增加。当然,拥塞控制和流量控制也有相似的地方,即它们都通过控制发送方发送数据的速率
来达到控制效果。
5.3.4.2 流量控制与拥塞控制的区别
拥塞控制
是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。流量控制
往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。
例如:
- 某个链路的传输速率为10Gb/s,某巨型机向一台PC以1Gb/s的速率传送文件,显然网络的带宽是足够大的,不存在拥塞问题,但如此高的发送速率将导致PC可能来不及接收,因此必须进行
流量控制
。 - 但若有100万台PC在此链路上以1Mb/s的速率传送文件,则现在的问题就变为网络的负载是否超过了现有网络所能承受的范围。就像我们上网一样,有时候加载会很慢,提示访问请求过多,请稍后再试,就是网络产生了拥塞,带宽小,一下不能支持给多个请求终端发送数据。
为了更好地对传输层进行拥塞控制,因特网建议标准定义了以下4种算法:慢开始、拥塞避免、快重传、快恢复。
5.3.4.3 拥塞控制的4种算法
慢开始与拥塞避免
慢开始算法
- 在TCP刚刚连接好并开始发送TCP报文段时,先令拥塞窗口
cwnd= 1
,即一个最大报文段长度MSS。每收到一个对新报文段的确认后,将cwnd
加1,即增大一个MSS。用这样的方法逐步增大发送方的拥塞窗口cwnd
,可使分组注入网络的速率更加合理。
例如,A向B发送数据,发送时A的拥塞窗口为2,那么A一次可以发送两个TCP报文段,经过一个RTT后(也称一个
传输轮次
),A收到B对刚才两个报文的确认,于是把拥塞窗口调整为4,下一次发送时就可一次发送4个报文段。
- 使用慢开始算法后,每经过一个传输轮次(即往返时延RTT),拥塞窗口cwnd就会加倍,即cwnd的大小指数式增长。这样,慢开始一直把拥塞窗口cwnd增大到一个规定的
慢开始门限ssthresh(阈值)
,然后改用拥塞避免算法
。
拥塞避免算法
- 拥塞避免算法的做法如下:发送端的拥塞窗口
cwnd
每经过一个往返时延RTT就增加一个MSS的大小,而不是加倍,使cwnd
按线性规律缓慢增长(即加法增大),而当出现一次超时(网络拥塞)时,令慢开始门限ssthresh
等于当前cwnd
的一半(即乘法减小)。 - 根据
cwnd
的大小执行不同的算法,可归纳如下:- 当
cwnd
<ssthresh
时,使用慢开始算法。 - 当
cwnd
>ssthresh
时,停止使用慢开始算法而改用拥塞避免算法。 - 当
cwnd
=ssthresh
时,既可使用慢开始算法,又可使用拥塞避免算法(通常做法)。
- 当
网络拥塞的处理
-
网络出现拥塞时,无论是在慢开始阶段还是在拥塞避免阶段,只要发送方检测到超时事件的发生(未按时收到确认,重传计时器超
时),就要把慢开始门限
ssthresh
设置为出现拥塞时的发送方的cwnd
值的一半(但不能小于2)。然后把拥塞窗口cwnd
重新设置为1,执行慢开始算法。这样做的目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理
完。
-
拥塞避免并不能完全能避免拥塞。利用以上措施要完全避免网络拥塞是不可能的。
拥塞避免是指在拥塞避免阶段把拥塞窗口控制为按线性
规律增长,使网络比较不容易出现拥塞。
快重传和快恢复
快重传和快恢复算法是对慢开始和拥塞避免算法的改进。
快重传
在TCP可靠传输机制中,快重传技术
使用了冗余ACK来检测丢包的发生
。同样,冗余ACK也用于网络拥塞的检测
(丢了包当然意味着网络可能出
现了拥塞)。快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。当发送方连续收到三个重复的ACK报文时,直
接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时
。
快恢复
快恢复算法
的原理如下:
发送端收到连续三个冗余ACK (即重复确认)时,执行“乘法减小”算法
,把慢开始门限ssthresh
设置为出现拥塞时发送方cwnd
的一半。
与慢开始(慢开始算法将拥塞窗口cwnd
设置为1)的不同之处
是,它把**cwnd
的值设置为慢开始门限ssthresh
改变后的数值**,然后开始执行
拥塞避免算法(“ 加法增大”)
,使拥塞窗口缓慢地线性增大。由于跳过了cwnd从1起始的慢开始过程,所以被称为快恢复
。
小结
在流量控制
中,发送方发送数据的量由接收方决定,而在拥塞控制
中,则由发送方自己通过检测网络状况来决定。
实际上,慢开始、拥塞避免、快重传和快恢复几种算法
应是同时应用在拥塞控制机制之中的。
当发送方检测到超时的时候,就采用慢开始和拥塞避免。
当发送方接收到冗余ACK时,就采用快重传和快恢复。
注意:
发送方发送窗口的实际大小
由流量控制
和拥塞控制
共同决定。因此,当题目中同时出现接收端窗口(rwnd) 和拥塞窗口(cwnd) 时,发送方实际的发送窗口大小是由rwnd和cwnd中较小的那一个确定的。
最后
以上就是震动裙子为你收集整理的计算机网络知识总结五(传输层)的全部内容,希望文章能够帮你解决计算机网络知识总结五(传输层)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复