计算机网络-传输层

计算机网络的传输层是整个计算机网络体系中的关键层次,向上层的应用层提供服务,它是面向通信部分的最高层,也是用户功能中的最低层。

传输层的功能

  • 提供应用进程间的通信。我们的计算机上运行着多个应用程序,而每个程序却能够准确与对应服务器进行通信,你知道这是为什么吗?我们需要引出一个概念:端口。
    什么是端口?当我们上网时,可能有一部分网站在输入网址后跟上:(数字),这里网址后的数字就是我们的端口号。常见的端口号有web服务器的80端口,ftp服务器的21和20端口,SMTP的25端口等。这些都是服务器端的端口,当我们的客户机和服务器进行连接时,会分配一个端口号,这就是识别进程的唯一标识。传输层通过端口提供端到端的逻辑通信,传输层好像沿着水平方向传输数据,但事实上传输层之间没有水平方向上直接的物理连接。

  • 复用和分用。复用是指不同应用进程可使用同一个传输层协议传输数据,分用则是指接收方的传输层在剥去报文首部以后可以将数据发送到对应的进程。

  • 差错检测。

  • 提供TCP和UDP两种协议。当采用TCP协议时,尽管下面的网络是不可靠的,它却能提供逻辑上的可靠信道。而当采用UDP时,逻辑信道仍是不可靠的,只是尽力保证交付数据。

面向连接服务和无连接服务

面向连接服务是指当通信双方在通信前首先建立连接,通信过程中连接一直保持,通信完毕后会释放连接。TCP就是面向连接的传输协议,向上提供可靠的逻辑信道。
无连接服务是指通信双方在通信时无需建立连接,发送方直接将信息发送到网络中,只是尽力交付信息。UDP是无连接的传输协议,向上提供的则是不可靠的逻辑信道。

UDP协议

UDP协议的特点

  • 无需建立连接。与TCP不同的是,UDP不需要提前建立连接,这意味着UDP协议比TCP协议更快,因此对于一些对速度要求较高的应用(如DNS,网络音视频通话等)常常选用UDP协议。

  • 传输不可靠。省去了建立连接的过程,UDP直接将数据发送到网络,无法保证传输的可靠性。

  • UDP是面向报文的。应用程序交付的报文,UDP既不合并,也不拆分,直接添加首部以后交给网络层添加首部。

  • 分组首部开销小。UDP首部只有8B,而TCP有20B的首部开销。

  • 应用层可以控制发送时间和发送的数据。UDP没有拥塞控制,所以网络中的拥塞不影响主机发送效率。

UDP数据报

UDP数据报主要由用户数据和UDP首部组成,其中UDP首部由源端口、目的端口、UDP长度和UDP校验和组成。其中UDP长度的最小值为8,表示只有UDP首部而没有数据部分。

UDP数据包格式

TCP协议

TCP协议的特点

  • TCP是面向连接的传输层协议。

  • TCP提供可靠交付服务,能保证数据有序、无差错、不重复且无丢失。

  • 允许全双工通信,通信双方能够同时发送和接受数据。因此通信双方都有发送缓存和接收缓存。

  • TCP协议面向字节流。TCP协议将应用层传递下来的数据视为一串无结构的字节流。

TCP报文段

TCP报文段格式

  • 源端口和目的端口各占2B,前面UDP数据报也有。

  • 序号字段占4B,是该报文段第一个字节的序号,比如当前报文段的序号是101,报文段的长度是100B,说明当前报文段的最后一个字节的序号是200,则下一个报文段序号是201。

  • 确认号字段占4B,是指期望收到的下一个报文段的第一个字节的序号。例如B收到A发送的报文段,这个报文段的序号是101,报文段长度是100B,B期望收到的下一个报文段是第一个字节序号是201,所以确认号就是201。

  • 数据偏移占4bit,用于表示首部长度。数据偏移的单位是32位(4B),因此当数据偏移的值是15时,达到首部长度最大值60B。

  • 保留字段占6bit,用作保留今后使用,全为0,可忽略不计。

  • 紧急位URG占1bit,当URG=1时表示有紧急数据传送,相当于提高了优先级。

  • 确认位ACK占1bit,当ACK=1时表示确认号字段有效,若该值为0时表示确认号字段无效。TCP规定在连接建立以后所有报文段的ACK都要置为1。

  • 推送位PSH占1bit,当PSH=1时表示尽快交付应用程序,而不需要等到缓存满了以后再向上交付。

  • 复位位RST占1bit,当RST=1时表示TCP连接过程中出现严重错误(如主机崩溃等)需要释放当前连接,然后重新建立连接。

  • 同步位SYN占1bit,当SYN=1时表示这是连接请求或连接接收报文。当SYN=1且ACK=0时,则表明是连接请求报文。若对方同意建立连接,则在响应报文中设置SYN=1和ACK=1。

  • 终止位FIN占1bit,当FIN=1时表示传输完毕,准备释放连接。

  • 窗口字段占2B,接收方的缓存空间有限,该字段用于指定发送方允许发送的数据的长度,单位为字节。举个例子,当确认号为701,窗口字段为1000,表示从701号算起,接收方还有1000B的缓存接收空间。

  • 校验和占2B,和UDP一样用于数据校验。

  • 紧急指针字段占2B,指出该报文段有多少字节的紧急数据,其中紧急数据在报文段数据的最前面。

  • 选项字段长度可变,TCP最初只规定了一种选项,即最大报文段长度(MSS),MSS是TCP报文段中数据字段的最大长度。

  • 填充字段是为了使首部长度是4B的整数倍而存在。

三次握手

三次握手在面试中属于及其高频的面试点,几乎是问到计算机网络的知识就会问三次握手。

三次握手

三次握手的第一步是客户端向服务器发起连接请求,这个请求中不携带数据。第一次握手的首部SYN设置为1,客户端还会随机分配一个起始序号seq=x。
第二步是当服务器收到客户端发送的报文段后,若同意建立连接,就向客户端返回一个确认报文段,并为该连接分配缓存和变量。确认报文段将SYN和ACK设置为1,设置确认号ack=x+1,服务器随机产生一个起始序号seq=y。这个确认报文段同样也不携带数据。
第三步是客户端收到了来自服务器的确认建立连接报文段后,向服务器发送确认信息,并为连接分配缓存和变量。此时的报文段ACK被设置为1,序号seq被设置为x+1,确认号ack被设置为y+1。该报文段可以携带数据,若不携带数据则不消耗序号。

四次挥手

与三次握手建立连接相对的,四次挥手是TCP断开连接的方式。

四次挥手

四次挥手第一步是客户机主动关闭连接,向服务器发送一个释放连接报文段,并停止发送数据。这个报文段的FIN终止位被置为1,并设置序号seq=u。此时客户机关闭了数据通路,但是由于TCP是全双工的,所以服务器仍然可以发送数据。
第二步是服务器接收到客户机发送的连接释放请求,向客户端发送确认报文段。将ACK设置为1,确认号ack=u+1,序号seq=v。此时客户机到服务器的连接释放了,但是服务器到客户端的数据通路仍然是连接的。
第三步是服务器已经没有需要传输的数据,则向客户机发送FIN=1的报文段释放连接。
第四步是客户机收到服务器的释放连接报文段后,向服务器发送确认报文段,报文段的ACK被置为1。此时还需要再等2MSL后,客户机才进入连接关闭状态。

TCP可靠连接

我们知道,TCP和UDP的不同点之一就是TCP是可靠连接而UDP是不可靠连接。下面就介绍一下TCP保证可靠连接的措施。
TCP确认机制是建立在报文段序号之上的,当接收方收到了发送方发来的0-2字节和6-8字节,而一直未收到3-5的字节,此时接收方向发送方返回的报文段中确认号设置为3,表示期待序号为3的报文段。重传有超时和冗余ACK两种实现机制,超时重传很容易理解,冗余ACK从字面上理解就是发送冗余的ACK。举个例子,A向B发送了序号为1、2、3、4、5、6的六个报文段,但B只收到了1、2、4、5、6号的报文段,此时B期望收到的报文段是3号,而4-6号报文段却先于3号送达,所以B向A发送3个ack=3的冗余ACK。根据TCP规定,当冗余ACK达到3个时,就视为那个报文段已经丢失,发送方A将重新发送3号报文。因为冗余ACK比起超时重传用时更短,因此又被称为快速重传。

TCP流量控制

什么是流量控制?为什么需要流量控制?我们知道,发送方发送分组和接收方接收分组的速率并不完全一致,很可能存在发送方发送分组过快导致丢包的现象。这时候就需要一种机制来实现制约发送方发送速率的情况,TCP流量控制就是解决这个问题的方法。
当发送方向接收方发送数据时,接收方会向发送方返回一个接收窗口值,这个接收窗口配合确认号ack可以控制发送方发送速率。以下是窗口机制实现流量控制实例。

可变窗口实现流量控制实例

上图中主机A向主机B发送数据刚开始建立连接时,窗口大小是400,后来随着发送方发送数据的增加,窗口也在动态调整大小。值得一提的是,TCP窗口单位是字节不是报文段。

TCP拥塞控制

拥塞控制和流量控制不同,拥塞控制是指TCP通过控制数据传输速率防止因数据过多造成网络阻塞。TCP规定发送方不仅要维护一个拥塞窗口,这个拥塞窗口的大小是发送方根据网络拥塞情况进行判断从而确定的。所以发送方发送速率不仅取决于接收窗口的大小,也取决于拥塞窗口的大小,发送上限取这两个窗口的较小值。
TCP维护拥塞窗口的算法主要包括四个:慢开始、拥塞避免、快重传和快恢复。

  • 慢开始。慢开始的“慢”不是指拥塞窗口cwnd的发送速率慢,而是TCP在初始设置的拥塞窗口较小,慢慢增大进行网络拥塞试探。算法最初设置窗口大小cwnd=1,每次接收到一个确认报文段后,都会将窗口值加一。于是一次往返延迟时间(RTT)以后,接收方对那个报文进行确认,拥塞窗口cwnd=2。再经过一次RTT以后,接收方对两个报文进行确认,cwnd=4。以此类推,我们可以发现,拥塞窗口大小是呈指数增长的,这印证了前面说的慢开始的“慢”不是发送速率慢。当拥塞窗口超过了一个阈值ssthresh之后,开始使用拥塞避免算法。

  • 拥塞避免。拥塞控制算法的思想是当慢开始使拥塞窗口大小达到阈值ssthresh时,每次经过一个RTT时,窗口大小增加1,而不是像慢开始一样,每次都是成倍增长。当出现一次拥塞时,将阈值ssthresh设置成为当前拥塞窗口cwnd的大小的一半(但阈值不能小于2)。然后拥塞窗口cwnd重新设置为1,重新进行慢开始算法。

TCP拥塞窗口cwnd在拥塞控制时的变化情况

从上图可以看出当窗口cwnd达到24时,出现网络拥塞,阈值ssthresh被降为此时cwnd的一半即为24,并重新进入慢开始阶段。

  • 快重传。前面的TCP可靠传输中我们提到了冗余ACK可以保证TCP的可靠性,在这里的快重传中我们同样使用冗余ACK来完成丢包检测。一旦接收方收到了失序的报文,立马发送一个ACK给发送方。当发送方收到三个同样的ACK报文时,就可以认为发生了丢包,需要进行重传。

  • 快恢复。快恢复的思想是一旦发送方接受到三个重复的ACK报文时,将阈值ssthresh设置为当前拥塞窗口cwnd的一半,然后跳过慢开始的步骤,直接将拥塞窗口的值设置为ssthresh,使拥塞窗口大小线性增加。

参考文献

2020王道计算机网络
计算机网络(第7版)-谢希仁
通俗易懂讲解TCP流量控制机制,了解一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值