文章目录
运输层
【1】运输层基本概念
用户应用层的下面就是运输层了,运输层是作为通信部分的最高层,也是用户功能中的最低层。只有网络边缘部分的主机协议栈有运输层,网络核心部分的主机一般只用到了下面的三层(物理层、数据链路层、网络层)
在一台主机中,经常有多个应用进程分别与另一个主机中的多个应用进程通信
运输层的重要功能: 复用(multiplex)、分用(demultiplex)
(1)复用针对发送方
(2)分用针对接收方
【1.1】端口
从上图中可以看到,进程和TCP、UDP的通信采用端口接轨
从网络层角度: 通信的双方是主机
从运输层的角度: 通信的双方是主机中进程
端到端的通信是应用进程之间的通信
运输层作用: 处理进程之间的通信,端口对应着进程
端口:
- 端口号一般是16位
- 端口号具有本地意义,即代表了本地计算机应用层的进程
故两个计算机之间的通信,不仅要知道对方的IP地址(用来确定主机位置)还要知道对方的端口号(确定进程)
【1.2】运输层和网络层协议区别
- IP协议的作用范围(网络层): 提供主机之间的逻辑通信
- TCP和UDP协议的作用范围(运输层): 提供进程之间端到端的逻辑通信
运输层的另一个特点就是屏蔽特性:运输层向高层用户屏蔽了下面的网络细节,使得看起来就是进程和进程之间一个简单的逻辑通信
【2】运输层协议UDP和TCP
- UDP(User Datagram Protocol 用户数据报协议)
- TCP(Transmission Control Protocol 传输控制协议)
当运输层采用UDP协议时,UDP协议是无连接的,是一条不可靠信道
当运输层采用TCP协议时,TCP是面向连接的,是一条可靠的全双工信道
运输层的运输单元: 运输协议数据单元TPDU(Transport Protocol Data Unit)
【2.1】用户数据报协议UDP
UDP协议只在IP数据报服务上增加很少的功能:
- 复用和分用功能
- 差错检测功能
UDP协议的特点:
- 提供无连接服务,在传输数据前不需要提前建立连接
- 传送的数据单元是UDP报文/用户数据报
- 接收方收到UDP报文后,不用任何确认
- UDP支持所有的广播/多播方式,一对一、一对多、多对一、多对多
- UDP的首部8字节(TCP首部20字节),UDP开销更小
UDP用户数据报在运输层之间的端到端逻辑信道中传输,UDP将应用层传下来的数据原封不动的转发(不合并不拆分),一次发送一个报文
用户数据报UDP有2个字段:
- 数据字段
- 首部字段(8字节)
UDP的通信虽然要用到端口号(对应进程),但由于UDP是无连接的,因此不需要套接字
UDP是面向报文的
【2.2】传输控制协议TCP
TCP是面向字节流的
- “流”stream:流入流出进程的字节序列
- 面向字节流:进程和TCP之间的传输是数据块,但TCP仅仅将数据看成一连串无结构的字节流
- 接收方收到的字节流要与发送方一致
TCP不关心应用进程一次向TCP缓存写入了多长的报文,TCP都会将连续的字节流进行分段,形成TCP报文段
TCP特点:
- 提供面向连接的服务
- 传送数据单元是TCP报文段
- TCP不提供广播或多播服务
- 开销较大,因为要提供可靠传输,首部字段增大,占据更多处理机资源
TCP报文段是在运输层抽象的端到端逻辑信道中传输的,是可靠的全双工通信。不过在数据传输过程中,并不知道到底经过了多少个路由器,而且这些路由器也不知道运输层是都建立了TCP 连接
注意:
- TCP连接是一条虚连接,不是实际的物理连接
- TCP不关心进程向TCP缓存写入了多长的报文
- TCP自主根据网络状况,决定将报文拆分成多大的报文段(UDP报文段是由进程直接给出的)
【2.2.1】TCP套接字的概念
运输层是进程间的通信,进程通过端口号对应。在UDP协议中进程对应端口号,在TCP协议中进程对应的是套接字(socket)
套接字: 端口号拼接到IP地址就是套接字(两者的结合)
socket = (IP地址: 端口号)
运输层的TCP协议是面向连接的,这条链接是虚连接,连接的两个端点就是套接字
TCP链接 = { socket1, socket2} = {(IP1, port1), (IP2, port2)}
【2.2.2】TCP报文段的首部
TCP是面向字节流的,但TCP传送的数据单元是报文段
TCP报文段的首部的前20个字节是固定的,后面的4n个字节是可变的
(TCP报文段的首部大小 >= 20字节)
【3】TCP可靠传输的原理
理想的传输条件:
- 传输信道不产生差错
- 不管发送方以多快的速度传送数据,接收方总是来得及处理接收到的数据
现实中的网络信道都是无法满足这些条件,故为了达到可靠传输,需要使用一些可靠传输协议,在不可靠的信道中实现可靠传输
TCP有两种实现可靠传输的协议:
- 停止等待协议
- 连续ARQ协议
【3.1】停止等待协议
停止等待协议: 每发送完一个分组就停止发送,等待接收方的确认(ACK),在收到对方确认后再发送下一个分组
ACK:Acknowledgement character 确认字符
接收方收到的分组会出现两种情况: 有差错和无差错
例:“A发送分组group1给B,发送完暂停等待B的确认应答”
接收端B在确认数据的过程中会出现2中情况:
- 分组出错:B接收到的group1出错,则会自动放弃group1,不会通知A
- 分组丢失:group1传输过程中丢失了,此刻B什么也不知道,什么也不做
(不论哪种情况,出错后,接收端什么也不会做)
【3.2】连续ARQ协议
【3.2.1】自动重传请求ARQ
停止等待协议的问题——分组出错后接收端什么也不会做,这样会造成很多问题,故引入自动重传请求ARQ 来解决这个问题
ARQ(Automatic Repeat Request 自动重传请求):在发送端会设置一个超时计时器
- 在设定时间内收到了ACK确认应答则继续发送下一个分组
- 若时间内没有收到则重发分组(超时重发)
注意:
- 发送端在停止等待时,要暂时保存已发送的分组副本,以备超时重发
- 分组和确认分组都要进行编号
- 超时计时器的设定时间要大于数据往返的平均时间
自动重传请求ARQ是自动进行的,接收方不需要告诉发送方“你要重传”
【3.2.2】流水线传输
停止等待协议的传输效率较低,信道利用率也较低
流水线传输就是发送方可连续发送多个分组,不用每发送完一个分组就停下来等待对方确认,这样信道上就不断的有数据传输,提高传输效率和信道利用率
【3.2.3】连续ARQ协议
自动重传请求ARQ解决了停止等待协议的问题,但是传输的效率依然较低,依然要等待很长时间才能完成传输
连续ARQ: 发送方设置一个发送窗口,且位于发送窗口内的分组都可以连续发送,不需要等待确认应答,每确认一个分组则发送窗口下移一位发送。若中间分组出错,则窗口内后面的分组会跟着重传一次。
例:“本来连续发送了5个分组,结果第2个分组丢失,故窗口仅仅移动了两位,2、3、4、5号分组还会重传一次”
连续ARQ协议的关键点在于那个发送窗口,类似于排队的队列,确认一个则从后面再安排一个进入窗口,以此提高效率的同时完成可靠传输
【3.3】可靠传输总结
- 可靠传输的本质: 确认应答 + 分组出错会重传
- 停止等待协议: 会确认应答确保发送分组送到了,但是出错没有反馈
- 自动重传请求ARQ: 设置超时计时器,解决了重传问题,但效率较低
- 连续ARQ: 利用发送窗口,解决了效率问题
【4】常用的熟知端口
【5】TCP拥塞控制
网络出现拥塞的原因:对资源的需求 > 可用资源(发送到网络上的数据太多了)
当拥塞很严重的时候,就变成了进程死锁。同时,不能通过增大资源解决拥塞问题,反而会影响网络性能。
拥塞引起的重传不会缓解网络的拥塞,返回会加剧拥塞程度,会导致更多的分组流入网络被路由器丢弃
解决拥塞的核心点: 减少数据流入网络——控制数据流入
拥塞控制的作用:
- 提高资源利用率
- 避免发生死锁(吞吐量=0)
【5.1】流量控制和拥塞控制
拥塞控制:
- 拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器、以及与网络传输性能有关的所有因素
- 拥塞控制就是防止过多的数据流入到网络中,使网络中的路由器/链路不过载
流量控制:
- 流量控制是一个端到端的问题, 接收端和发送端之间的问题
- 流量控制就是发送端控制发送的速率,以便接收端可以来得及接收
【5.2】TCP拥塞控制方式
开环控制方法:设计网络之初就做好放拥塞设计
闭环控制方法(TCP采用): 是基于反馈环路的概念
- 监测网络系统,以便检测到拥塞在何时何地
- 将拥塞信息发送到可以处理的地方
- 调整网络运行以解决发生的问题
TCP采用基于窗口的方式进行拥塞控制(闭环控制方法)
(1)只要网络无拥塞,就将拥塞窗口增大一些,以便把更多的分组发送出去
(2)只要网络出现拥塞,就将窗口减小,减少注入到网络中的分组数量
基于窗口的拥塞控制方法与连续ARQ协议不谋而合
拥塞判断:
- 重传定时器超时
- 收到三个相同/重复的分组
TCP拥塞控制算法:
- 慢开始(slow start)
- 拥塞避免(congestion avoidance)
- 快重传(fast retransmit)
- 快恢复(fast recovery)
【6】TCP三次握手
TCP利用套接字建立连接的过程叫做握手
TCP的握手需要在客户端和服务器端交换三个TCP报文段——“三报文握手”
三次握手的目的: 防止已失效的连接请求报文段突然又传送到了,进而产生错误(建立可靠连接)
TCP三次握手过程:
- 客户端A的TCP向服务器B的TCP发出连接请求报文段,其首部中的同步位SYN=1,并选择序号seq=x(表明传送数据的第一个数据字节序号)
- 服务器B的TCP收到请求报文段,若同意,则响应确认报文段:SYN=1,ACK=1,确认号ack=x+1,自选序号seq=y
- 客户端A收到确认报文段后再向服务器B确认:ACK=1,确认号ack=y+1,同时客户端A通知上层应用连接已建立。
三次握手,说白了,就是多了一次再确认过程,客户端向服务器确认一下它的响应是不是这个
微信公众号:<小杨的python之路>