感兴趣的朋友可以去我的语雀平台进行查看更多的知识。
https://www.yuque.com/books/share/ffbf2b86-52af-4a4f-b144-507a890fb8dc?# 《木子Teng的计算机知识库》
传输层的功能如下:
端到端
的逻辑通信。“逻辑通信”
的意思是:传输层之间的通信好像是沿水平方向传送数据,但事实上这两个传输层之间并没有–条水平方向的物理连接。注意:
复用
是指发送方不同协议的数据都可以封装成IP数据报发送出去。分用
是指接收方的网络层在剥去首部后把数据交付给相应的协议。服务访问点
(SAP),它在传输层的作用类似于IP地址在网络层的作用或MAC地址在数据链路层的作用,只不过IP地址和MAC地址标识的是主机,而端口标识的是主机中的应用进程
。数据链路层的SAP是MAC地址,网络层的SAP是IP地址,传输层的SAP是端口
。在网络中通过IP地址来标识和区别不同的主机,通过端口号来标识和区分一台主机中的不同应用进程
。在网络中采用发送方和接收方的套接字
(Socket)
组合来识别端点
。
为什么应用开发人员宁愿在UDP之上构建应用,也不选择TCP?既然TCP提供可靠的服务,而UDP不提供,那么TCP总是首选吗?
答案是否定的,因为有很多应用更适合用UDP,主要是因为UDP具有如下优点:
速度
会慢很多。可靠性
是至关重要的。某些专用应用服务器使用UDP
时,一般都能支持更多的活动客户机
。TCP
有20B
的首部
开销,而UDP
仅有8B
的开销。不会影响主机的发送效率
。某些实时应用要求以稳定的速度发送
,能容忍一些数据的丢失,但不允许有较大的时延
,而UDP正好满足这些应用的需求。应用实体可以根据应用的需求来灵活设计自己的可靠性机制
。应用层交下来的报文
,在添加首部后就向下交付给IP层,既不合并,也不拆分
,而是保留这些报文的边界;报文不可分割,是UDP数据报处理的最小单位
。各字段意义如下:
根据首部中的目的端口,把UDP数据报通过相应的端口上交给应用进程
如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于端口号的应用进程),那么就丢弃该报文,并由ICMP发送“端口不
可达”差错报文给发送方
。
伪首部和全0字节是不发送的,仅供校验使用
TCP传送的数据单元称为报文段
。一个TCP报文段分为TCP首部和TCP数据两部分,整个TCP报文段作为IP数据报的数据部分封装在IP数据报中源端口和目的端口字段
。各占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。连接建立、数据传送和连接释放
。TCP连接的管理就是使运输连接的建立和释放都能正常进行
。在TCP连接建立的过程中,要解决以下三个问题:
每条TCP连接通过通信两端的两个端点( 即两个套接字)
确定。
连接的建立—三次握手
确认号字段
,告诉对方我接下来应该接收的数据是从字节序号ack开始的数据确认号字段ack
无效,1时确认号字段ack
有效TCP提供的是全双工通信,因此通信双方的应用进程在任何时候都能发送数据。
服务器端的资源是在完成第二次握手时分配的
而客户端的资源是在完成第三次握手时分配的,这就使得服务器易于受到SYN洪泛攻击。
SYN泛洪攻击
seq=u, 它等于前面已传送过的数据的最后一个字节的序号加1
(FIN报文段即使不携带数据,也要消耗一个序号)。确认号是ack=u+ 1,而这个报文段自己的序号是v,等于它前面已传送过的数据的最后一个字节的序号加1
。从服务器到客户机这个方向的连接并未关闭
。发出FIN= 1的连接释放报文段
。客户机收到连接释放报文段后,必须发出确认
。在确认报文段中,ACK字段被置为1,确认号ack=w+1,序号seq=u+1.此时TCP连接还未释放,必须经过时间等待计时器设置的时间2MSL后,A才进入连接关闭状态
。关于连接和释放,ACK、SYN、FIN一定等于1。
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口rwnd
, 即调整TCP报文段首部中的“窗口”字段值
,来限制发送方向网络注入报文的速率。
同时,发送方根据其对当前网络拥塞程序的估计而确定的窗口值,这称为拥塞窗口cwnd
,其大小与网络的带宽和时延密切相关。
例如
,在通信中,有效数据只从A发往B,而B仅向A发送确认报文,这时B可以通过设置确认报文段首部的窗口字段来将rwnd通知给A。
rwnd 即接收方允许连续接收的最大能力,单位是字节。
发送方A总是根据最新收到的rwnd值来限制自己发送窗口的大小,从而将未确认的数据量控制在rwnd大小之内,保证A不会使B的接收缓存溢出。
当然,A的发送窗口的实际大小取rwnd和cwnd中的最小值
。
TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。
若持续计时器设置的时间到期,就发送一个零窗口探测报文段 。接收方收到探测报文段时给出现在的窗口值。
若窗口仍然是0,那么发送方就重新设置持续计时器。
传输层和数据链路层的流量控制的区别是:
端到端
用户之间的流量控制,数据链路层定义两个中间的相邻结点
的流量控制。数据链路层
的滑动窗口协议的窗口
大小不能动态变化
,传输层
的则可以动态变化
。所谓拥塞控制,是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载
。出现拥塞时,端点并不了解到拥塞发生的细节,对通信连
接的端点来说,拥塞往往表现为通信时延的增加。当然,拥塞控制和流量控制也有相似的地方,即它们都通过控制发送方发送数据的速率
来达到控制效果。
拥塞控制
是让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。流量控制
往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。例如:
流量控制
。为了更好地对传输层进行拥塞控制,因特网建议标准定义了以下4种算法:慢开始、拥塞避免、快重传、快恢复。
慢开始与拥塞避免
慢开始算法
cwnd= 1
,即一个最大报文段长度MSS。每收到一个对新报文段的确认后,将cwnd
加1,即增大一个MSS。用这样的方法逐步增大发送方的拥塞窗口cwnd
,可使分组注入网络的速率更加合理。例如,A向B发送数据,发送时A的拥塞窗口为2,那么A一次可以发送两个TCP报文段,经过一个RTT后(也称一个
传输轮次
),A收到B对刚才两个报文的确认,于是把拥塞窗口调整为4,下一次发送时就可一次发送4个报文段。
慢开始门限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中较小的那一个确定的。