计算机网路难?看了这个我妈都能学会!(第五章)

第五章 传输层

通过前面几章学习,我们知道了主机与主机之间的通信流程,但实际上,进行通信的真正实体是位于通信两端主机中的进程
传输层的任务:如何为在不同主机上的应用进程提供直接的通信服务
根据应用法国需求的不同,因特网的传输层为应用层提供了两种不同的传输协议,即面向连接TCP无连接的UDP

1. 传输层概述

首先要先学习端口号分用复用

  • 运行在计算机上的进程使用进程标识符PID来标志。
  • 因特网下的计算机并不是统一的操作系统,所以使用不同格式的进程表示符。
  • 为了使不同操作系统的计算机的应用进程之间能够通信,需要使用统一的方法对TCP/IP体系的应用进程进行标识
  • TCP/IP体系的传输层使用端口号来区分应用层的不同应用进程。
    • 端口号使用16bit表示,范围0~65535;
    • 端口号只具有本地意义,这只是为了标识本计算机应用层中的各进程,在因特网中,不同计算机的相同端口号是没有联系的

发送方的复用接收方的分用,以及常用的应用层协议所使用的端口号
Alt
Alt

2. TCP协议

TCP协议:传输控制协议TCP(Transmission Control Protocol),仅支持单播(一对一通信),向上层提供面向连接可靠传输服务
(适用于要求可靠传输的应用,例如文件传输)

2.1 连接管理(三次握手四次挥手)

TCP是面向连接的协议,它基于运输连接来传输TCP报文段。
TCP运输连接有以下三个阶段:

  1. 建立TCP连接(三报文握手)
  2. 数据传送(可靠传输、流量控制、拥塞控制)
  3. 释放TCP连接(四报文挥手)

首先介绍建立连接阶段—— “三报文握手”
Alt
如上图所示:

  1. 服务器和客户端在CLOSED关闭阶段,均先自动生成传输控制块,控制块里面包含了TCP连接表、指向发送和接收缓存的指针、指向重传队列的指针等。
  2. 首先服务器端被动进入监听LISTEN状态,等待客户端发送请求。
  3. 接着,客户端想要与服务器建立连接,于是发送TCP请求连接请求报文,并进入同步已发送状态SYN-SENT。里面的同步位SYN=1代表这是一个TCP请求报文段;seq序号字段设置为了x。(TCP规定,SYN=1的报文段,不能携带数据)
  4. 服务器收到TCP连接请求报文后,发送一个TCP连接请求确认报文,并将状态改为同步已接收状态SYN-RCVD。这里SYN=1、ACK=1,代表这是连接请求确认报文段;seq=y,代表此报文序号为y,ack=x+1代表这是对序号为x的报文的确认报文。(这里是的SYN=1的报文段,同样不能携带数据)
  5. 客户端收到了服务器发来的TCP连接请求确认报文后,进入连接已建立状态ESTABLISHED,然后向服务器发送一个普通的TCP确认报文段。报文段中ACK=1代表这是一个普通的TCP确认报文段;seq=x+1,这是因为seq=x已经在之前被使用过,于是使用x+1;ack=y+1代表这是对前面服务器发送的报文段的确认报文段
  6. 服务器在收到这个普通的确认报文段后,就知道了对方进入了连接状态,自己也进入连接已建立状态ESTABLISHED,此时两者就可以进行数据传输了。

为什么选择三报文握手,而不是两报文,我们只需记住:
这是为了防止已失效的连接请求报文段突然又传到了TCP服务器,服务器进入连接状态,但客户端却没有准备要发送数据,这就导致了服务器的资源浪费。

接下来介绍连接释放阶段—— “四报文挥手”

如上图所示:

  1. 客户端先主动关闭连接已建立状态ESTABLISHED,并进入终止等待1状态FIN-WAIT-1,然后发送TCP连接释放报文段。FIN=1、ACK=1表明这是一个TCP连接释放报文段,同时对前面收到的最后一个字节进行确认;seq=u,u为前面收到最后一个字节的序号+1;ack=v,它也为前面收到数据的最后一个字节的序号+1。
  2. 服务器收到后,然后发送一个TCP普通确认报文段。ACK=1表示这是一个普通的确认报文段;seq=v,v=TCP服务器进程之前已传送过的数据的最后一个字节的序号+1;ack=u+1表示对刚接收的序号为u的报文段的确认报文段,最后TCP服务器进程应通知高层应用进程,自己要断开连接,然后被动进入关闭等待状态CLOSE-WAIT
    (注意:此时TCP服务器进程只是通知其高层应用进程,客户端要与服务器断开连接,但并没有真正的与TCP客户端断开连接)
  3. 客户端收到了这个TCP普通确认报文段,进入了终止等待2状态FIN-WAIT-2,并等待TCP服务器发送的TCP连接释放报文段
  4. 若TCP服务器进程的应用进程已经没有数据要发送了,则关闭应用进程与服务器进程的连接,此时TCP服务器就进入了最后确认状态LAST-ACK,并向客户端发送TCP连接释放报文段。FIN=1、ACK=1代表这是一个TCP释放连接报文段,同时对之前收到的报文段进行确认;seq=w,这是因为此时服务器可能还发送了一些数据,w为之前发送数据的最后一个字节的序号+1;ack=u+1,代表对之前的第一个TCP连接释放报文段的确认。
  5. 客户端收到了服务器发来的TCP连接释放报文段后,进入时间等待状态TIME-WAIT,并向服务器发送一个普通的确认报文段。ACK=1代表这是普通的TCP确认报文段,seq=u+1,因为前面发送的连接释放报文段的seq为u,占用了一个序号;ack=w+1,对刚接收到的连接释放报文段的确认。
  6. 最后,服务器收到这个普通报文段后,就进入了关闭状态CLOSED;客户端在经过2MSL(最长报文寿命,一般一个MSL大概是两分钟)后,也进入了关闭状态CLOSED
    (等待的原因,就是怕发送出去的那个普通报文段丢失了之后,客户端已经进入关闭状态的话,就不能重发那个字段,导致服务器不能进入关闭状态)

2.2 可靠传输

TCP基于以字节为单位的滑动窗口来实现可靠传输。
TCP数据报使用选择重传协议SR

选择重传协议SR,在链路层中已经讲解,可点击此链接进行复习一下:请在此文章中的 “1.3可靠传输中的选择重传协议SR” 进行复习

可靠传输的核心是根据窗口的状态选择如何发送数据:
Alt

关于TCP的传输机制:

  • 虽然发送方的发送窗口是根据接收方的接收窗口设置的,但在同一时刻,发送方的发送窗口并不总是和接收方的接收窗口一样大
    • 不一样大的原因就是时间滞后、可能出现网络拥塞情况。
  • 对于不按序到达的数据,接收方先将其存放在接收窗口中,等正确序号的字节到达后,再按序交付给上层的应用进程。
  • TCP要求接收方必须有累积确认和捎带确认机制,这样可减少传输开销。
  • TCP通信是全双工通信,每一方都有自己的发送窗口和接收窗口。

2.3 流量控制

这里举出一个例子,TCP所使用的流量控制手段是选择重传协议SR
Alt
当接收方的接收窗口将0调整为大于0时(有更多的缓存接收空间了):
Alt

2.4 拥塞控制

  • 拥塞: 某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变差,这种情况叫做拥塞。
  • 若出现拥塞而不控制,整个网络吞吐量会随输入负荷增大而下降,如下图所示:
    Alt

那么TCP协议如何进行拥塞控制,其拥塞控制算法有四种:慢开始、拥塞避免、快重传、快恢复
Alt
首先是慢开始和拥塞避免

  • 发送方维护一个拥塞窗口cwnd,其大小取决于网络的拥塞程度,且动态变化
    • 维护cwnd原则: 只要网络没有出现拥塞,cwnd就增大一些;如果出现拥塞,cwnd就减少一些。
    • 判断出现拥塞依据:没有按时收到确认报文(超时重传)。
  • 发送方将拥塞窗口作为发送窗口swnd ,即swnd=cwnd
  • 维护一个慢开始门限ssthresh状态变量:
    • cwnd<ssthresh,使用慢开始;
    • cwnd>ssthresh,使用拥塞避免;
    • cwnd=ssthresh,两个均可使用。

下面是慢开始算法与传输轮次的图来解释两种算法: Alt


所以这两种算法非常好理解,总结就是:

  1. 先有一个慢开始的临界值慢开始门限ssthresh,然后进行指数级增长(2的指数);
  2. 然后到达慢开始门限ssthresh后,cwnd就开始一个一个的增长了,直到出现了数据丢失从而重传计时器超时,出现了网络拥塞;
  3. 然后慢开始门限改为发生拥塞时的cwnd的一半,然后再将cwnd改为1重复上述操作。

这里的cwnd增长就根据维护cwnd原则,既然收到了接收方对最后一个数据的确认报文段,说明网络还没有拥塞,于是就增大cwnd。

注意,这里的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,然后逐渐增大,这当然比按照大的cwnd一下子把许多报文段突然注入到网络中要“慢得多”。

接下来介绍快重传和快恢复
慢开始和拥塞避免是1988年提出的TCP拥塞控制算法(TCP Tahoe版本)
1990年又增加了快重传和快恢复(TCP Reno版本) 来改进TCP性能,由于TCP Tahoe版本中,只要是发生超时重传就会认为是发生网络拥塞,实际上网络可能并未发生拥塞,这样就会降低传输效率。

所谓快重传, 就是使发送方尽快进行重传,而不是等超时重传计时器超时再重传:

  • 要求接收方一旦收到了数据就立即发送确认分组,而不是进行捎带确认(等接收方要发数据时顺带把确认分组发过去);
  • 接收方收到失序的报文段就发送上一个正确序号的分组的确认报文;
  • 发送方一旦收到连续的3个重复确认,就立即重传此报文,如图所示:
    Alt

发送方一旦收到3个重复确认后,就知道了不是出现了网络拥塞,于是不启动慢开始,而执行快恢复算法

  • 慢开始门限ssthresh拥塞窗口cwnd都调整为当前窗口的一半,再开始执行拥塞避免算法。
  • 有的快恢复时要把cwnd值+3,即为新的ssthresh+3,原因是既然发送方收到了三个重复的确认,表明已经有三个报文段发送过去了且在接收方的缓冲中,因此可以将拥塞窗口扩大三个。

最后来个图总结上述四种算法:
Alt

2.5 TCP报文段的首部格式

为什么这里放到最后来讲,因为把前面的知识点搞懂之后,再来看TCP报文段的首部格式将会显得非常简单~
Alt
通过前面的知识点讲解,源端口,目的端口,序号,确认号,窗口,标志位ACK、SYN、FIN,校验和,填充就不过多赘述了,和之前遇到的IP首部格式是一样的。

数据偏移: 这是来表示首部长度的,占4字节,单位5B,例如0101,代表首部长度为0101转换成十进制为4在乘以5,结果为20。所以代表首部长度为20B。

紧急标志位URG: URG=1时,后面的紧急指针有效,URG=0时,后面的紧急指针无效。

推送标志位PSH: PSH=1时,表示此报文段会尽快上传给应用进程,不必等待接收缓存填满。

复位标志位RST: RST=1时,表示TCP连接出现了异常,必须释放连接,然后再重新建立连接。

紧急指针: 占16比特,指明紧急数据的长度,紧急数据会优先发送。

3.UDP协议

UDP协议:用户数据报协议UDP(User Datagram Protocol), 支持单播、广播、组播(多播),向上层提供无连接不可靠传输服务。
(适用于IP电话,视频会议等实时应用)

UDP数据报格式:
Alt

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值