TCP/IP体系结构之运输层

运输层


导读目录:

  1. 运输层协议的特点以及作用
  2. 进程之间的通信和端口等重要概念
  3. 用户数据报协议——UDP协议(User Datagram Protocol)
  4. 传输控制协议——TCP协议(Transmission Control Protocol)
    4.1 TCP协议基本知识
    4.2 可靠传输的工作原理(包括停止等待协议和ARQ协议)
    4.3 TCP报文段的首部格式
    4.4 滑动窗口
    4.5 流量控制
    4.6 拥塞控制
    4.7 连接管理

1.运输层协议的特点以及作用

运输层向它上面的应用层提供通信服务。
我们知道,IP协议能够把主机A发送出的分组按照首部中的目的地址交付到目的主机B中,为什么还需要运输层?

作用:

真正通信的主体是在主机中的进程,即A主机的一个进程与B主机的一个进程通信。然而IP协议只能把分组送到目的主机,但却不能交付给主机中的应用进程,而是停留在主机的网络层。在这里先引入复用和分用的概念。

复用: 指在发送方不同的应用程序都可以使用同一个运输层协议传送数据(需要加上适当的首部)。
分用: 指接收方的运输层在剥去报文的首部后能够把这些数据正确交付给目的应用程序。

举个例子:假设一个机构的所有部门向外发出的文件由收发室负责寄出,这就相当于各部门在“复用”这个收发室,当收发室收到外来的文件,则要完成“分用”的功能。


何为逻辑通信?
意思是:从应用层看,只要应用层把报文交给下面的运输层,运输层就可以把这报文传送到对面的运输层。
事实上,在逻辑通信的过程中,IP层也起到作用,因为两个运输层之间的数据传送并非是直接传送,而是经过IP层的传送。

所以:网络层是为主机之间提供逻辑通信,运输层是为应用程序提供端到端的逻辑通信。

此外,运输层还要对收到的报文进行差错检测。


2. 进程之间的通信和端口等重要概念

前面提到,IP层用IP地址来区分,把数据报交付到目的主机,运输层(TCP,UDP)则处理源主机的进程和目的主机的进程通信,通信目标的判定就是使用端口号,使用端口号来区分进程。

结合起来就是:用 IP地址(为了找到对方的计算机)+传输层协议+端口号(找到对方计算机中的应用程序) 来区分与谁进行通信。

服务器端使用的端口号,0~1023

客户端使用的端口号,49152~65535

这类端口仅在客户进程运行时动态选择,因此又称短暂端口号。
当服务器进程收到客户进程报文时就知道客户进程的端口号了,因而可以把数据发送给客户进程。通信结束后,刚才使用过的客户端口号就不存在了。


3. 用户数据报协议——UDP协议(User Datagram Protocol)

3.1主要特点

  • UDP是无连接的。 即发送数据之前不需要建立连接,因此减少了开销和数据发送之前的时延。
  • UDP使用尽最大努力交付。 即不保证可靠交付。因此主机不需要维持复杂的连接状态表。
  • UDP是面向报文的。
  • UDP没有拥塞控制。 因此网络出现拥塞不会使源主机的发送速率降低。
  • UDP支持一对一,一对多,多对一,多对对的交互通信。
  • UDP的首部开销小。 只有8个字节,比TCP的20个字节的首部要短。

3.2UDP的首部格式

用户数据报UDP有两个字段:数据字段和首部字段。

首部字段

由四个字段组成,每个字段都是两个字节。

  • 源端口
  • 目的端口
  • 长度 UDP用户数据报的长度。最小值是8
  • 校验和 检测UDP用户数据报在传输中是否有错,有错就丢弃。

检验和的计算方法:在UDP用户数据报之前增加12个字节的伪首部。

相关计算过程就不详谈了,有兴趣的可以戳:http://royliu.xyz/2018/03/15/手动计算UDP协议校验和/


4. 传输控制协议——TCP协议(Transmission Control Protocol)

4.1TCP主要特点以

  • TCP是面向连接的运输层协议。 使用之前必须建立连接,使用之后必须释放连接。
  • 每一条TCP连接只能有两个端点,每一条连接只能是点对点的。
  • TCP提供可靠交付的服务。 通过TCP连接传送的数据,无差错,无丢失,不重复,按序到达。
  • TCP提供全双工通信。 允许通信双方的应用程序在任何时候都能发送数据。TCP连接的两端设有发送缓存和接收缓存,用来存储双向通信的数据。发送时,应用程序把数据发送给TCP缓存就可以干自己的事情了,TCP会在合适的时候发送出去。接收时,TCP会把接收的数据放入缓存,应用程序在合适的时候读取缓存中的数据。
  • 面向字节流

4.2TCP的连接

每一条TCP连接有两个端点。这个端点叫做套接字(socket)。 端口号拼接到IP地址就构成了套接字。

							  套接字 socket = (IP地址: 端口号)
			
	TCP的连接被两个端点所确定:
							TCP连接:: = {socket1,socket2} = {(IP1: port1),(IP2: port2)}
								

4.3TCP的运输连接管理

运输连接有三个阶段:连接建立,数据传送,连接释放。

TCP的连接建立——三次握手与四次挥手


握手数据:
seq:初始序号。
ack:确认号。
SYN和ACK:报文段中的SYN位和ACK位。

挥手数据:
seq:等于前面已传送过的数据的最后一个字节的序号加1
FIN:报文首部的终止控制位FIN
MSL:MSL叫做最长报文段寿命
其余一样。

在这里讲下自己对于为什么进行四次挥手(即TIME-WAIT)的原因吧。
第一,为了保证A发送的最后一个ACK报文段能够到达B。因为报文段有可能丢失,因而处于LAST-ACK状态的B就会超时重传FIN+ACK报文段,而A就能在2MSL时间内收到重传的FIN+ACK报文段,接着A再重传一次确认,重新启动计时器。
第二,防止已失效的连接请求报文。A在发送完最后一个ACK报文段后,再经历2MSL后,就可以使本连接持续的时间内所产生的所有报文都从网络中消失。

有更加好的文章就不重复写了。

通俗大白话来理解TCP协议的三次握手和四次分手

里面也很好阐述了为什么进行三次握手和四次挥手的原因。

4.4可靠传输的工作原理(包括停止等待协议和ARQ协议)


图a情况是传输中没有出现差错情况下的,A发送完M1后收到确认再发送下一组。

图b是传输过程中出现差错,这里就采用了超时重传。实现超时重传就要在每发送完一个分组时设置一个超时计时器,如果在计时器到期之前收到对方的确认,就撤销已设置的超时计时器。


图a如所示,B接收到,但是回应确认消息的时候丢失,这时候A的超时计时器到期了,就又发送了M1,这时候B会丢弃重复的M1,再次重传确认消息。

图b是B在收到A发送的M1后,B回应确认消息返回给A时迟到了,这时候A又发送一次M1,同样的,B会丢弃M1,再次重传确认。A收到迟到后的确认消息会什么也不做。

使用上述的确认和重传机制,TCP就能在不可靠的传输网络上实现可靠的通信!!!

像上述的这种可靠传输协议常称为自动重传请求ARQ。 意思是重传的请求是自动进行的。


连续ARQ协议


发送方每收到一个确认就发发送窗口向前滑动一个分组的位置。

接收方采用累积确认方式。这就是说接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认。 这表示:到这个分组为止的所有分组都已正确收到了。

累积确认的优点: 容易实现,即使确认丢失也不必重传。
缺点: 不能向发送方反映出接收方已经正确收到的所有分组的信息。

举例子:比如发送方发送了前5个分组,而中间第三个分组丢失了,这时候接收方只能对前两个分组发出确认,发送方无法知道后面三个分组的下落,从而只能把后面三个分组重传一次。

4.5TCP报文段首部格式

TCP报文段首部的前20个字节是固定的。后面有4n字节按序增加。因此最小长度是20字节

  • 源端口和目的端口 各占2字节
  • 序号 4字节,本报文段中所发送的数据的第一个字节的序号。比如,一段报文序号字段值是301,携带数据100字节,则最后一个字节的序号是400。
  • 确认号 4字节 ,期望收到对方下一个报文段的第一个数据字节的序号。比如A发送一个报文段,序号字段值是501,长度为200字节,即501~700,这表明B正确收到A发送的到序号700为止的数据,因此B期望收到A的下一个数据序号是701,于是B发送给A的确认报文段中就把确认号置为701
    你只需记住: 确认号=N,则表明:到序号N-1为止的所有数据都已正确收到
  • 数据偏移 4位
  • 保留 6位
  • URG URG=1时,字段有效,表示此报文段中有紧急数据,应尽快传送。
  • ACK 仅ACK=1时,确认号字段有效。TCP规定,在连接建立后所有传送的报文段ACK必须置为1。
  • PSH
  • RST
  • SYN
  • FIN 终止FIN,用来释放连接,FIN=1表明此报文发送方数据发送完毕并要求释放运输连接。
  • 窗口 2字节
  • 校验和 2字节
  • 紧急指针 2字节
  • 选项

4.6滑动窗口

小于P1的是已发送并已收到确认的部分,大于P3的是不允许发送的部分
P3-P1=A的发送窗口大小
P2-P1=已发送但尚未收到确认的字节数
P3-P2=允许发送但当前尚未发送的字节数(可用窗口)

窗口和缓存的关系:


发送缓存用来暂时存放:
1.发送应用程序传送给发送方TCP准备发送的数据
2.TCP已经发送出当尚未收到确认的数据

接收缓存用来暂时存放:
1.按序到达的,但尚未被接收应用程序读取的数据
2.未按序到达的数据。

超时重传时间的选择:

运用了Karn算法

选择确认SACK(Selective ACK)

顾名思义,就是接收到的报文段无差错,只是未按序号,那么就只传送缺少的数据而不重传已经正确到达接收方的数据。

4.7 TCP的流量控制

流量控制的目的:让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制就可以实现对发送方的流量控制。

就是通过改变接收方的接收窗口大小。以此来进行流量控制。(rwnd意思为接收方窗口即接收窗口)

4.8 TCP的拥塞控制

概念:在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。

拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。

拥塞控制算法是向发送端发送控制报文,并告诉发送端,网络出现麻烦,必须放慢发送速率。

拥塞控制是基于窗口实现。发送方维持一个拥塞窗口 的状态变量,拥塞窗口大小取决于网络拥塞程度,并且动态变化。
发送方让自己的发送窗口等于拥塞窗口

判断网络拥塞的依据就是出现了超时,即发送方没有按时收到确认报文。

4.8.1 拥塞控制方法1——慢开始

即主机开始发送数据的时候,由小到大逐渐增大发送窗口。
因为如果开始发送时,立即把大量的数据字节注入网络,那么就有可能因此网络发生拥塞。

那么,窗口应该如何逐渐增大?
增大的倍数是2,也就是说,开始窗口大小为1,发送报文出去收到确认后就变为2,接着4,8,,,,


4.8.2 拥塞控制方法2——拥塞避免

拥塞避免算法是让拥塞窗口缓慢地增大,即每经过一轮就把发送方的拥塞窗口加1

图中标号4-5出现了异常情况,解析如下(正好是拥塞控制的缺点)。
缺点:有时,个别报文会在网络中丢失,但实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,误以为网络发生拥塞。这就导致发送方错误启动慢开始把拥塞窗口设置为1,从而降低了效率。


4.8.3 拥塞控制方法3——快重传

采用快重传方法可以让发送方今早知道发生了个别报文段的丢失。

  • 首先,快重传要求接收方接收到报文后要立即发送确认。即使收到失序的报文也要立即发出确认。

规定:发送方只要一连收到3个重复确认,就认为接收方确实没有接受到相对应的报文。此时应该立即进行重传,这样就不会出现超时,发送方也不会误认为出现网络拥堵。

4.8.4 拥塞控制方法4——快恢复

快恢复算法是这样规定:当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始的门限值ssthresh减半,这只是发送方提前预防网络拥塞的措施。

意思就是恢复到上次窗口的大小,即执行乘法减小(Multiplicative Decrease即MD)。与拥塞避免算法相反,拥塞避免算法是加法增大(Additive Increase即AI)。二者合在一起就是AIMD算法。

													快重传与快恢复

拥塞控制的流程图

发送方的窗口上限值=Min{rwnd(接收方窗口),cwnd(拥塞窗口)}
rwnd<cwnd,接收方的接收能力限制发送方窗口的最大值
cwnd<rwnd,网络的拥塞程度限制发送方窗口的最大值
也就是说,rwnd和cwnd中数值较小的一个,控制了发送方发送数据的速率。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值