运输层:传输控制协议TCP

TCP协议是TCP/IP协议族中非常复杂的协议。本章节就由浅入深的总结下。

知识点概览

在这里插入图片描述

一、TCP基础

1、tcp的有哪些主要特点?

(1)面向连接的运输层协议

应用程序使用TCP之前要先建立连接,传送数据完毕后必须释放建立的链接。

(2)一条TCP链接只能有两个端点

也就是说每条TCP链接只能是点对点(一对一)的。

(3)TCP提供数据的可靠交付。

TCP传送的数据无差错、不丢失、不重复、按顺序到达。

(4)TCP提供全双工通信

1、TCP允许通信双方的进程在任何时候都能发送数据
2、TCP两端设有发送缓存,接收缓存。用来临时存放双向通信的数据。
3、发送时,应用程序吧数据传送给TCP的缓存中,TCP在合适的时候发送出去。
4、接收时、,TCP吧数据放入缓存,上层应用进程在合适时读取缓存。

(5)面向字节流

1、流入到应用进程或者从应用进程流出的是字节序列。
2、虽然应用程序和TCP交互为一个个大小不等数据块,但是TCP吧每个数据块都看作一段段字节流。
3、TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系,但是接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
ps:简略图如下:

在这里插入图片描述

2、TCP链接

TCP是面向连接的,TCP的很多特性都与这个有关,那么TCP的链接的到底是啥
其实TCP链接的端点既不是主机,不是主机的IP地址、不是应用进程、也不是运输层的协议端口。TCP链接的端点叫套接字(插口)。

(1)套接字(socket)

1、套接字:RFC 793定义端口号拼接到IP地址就构成了套接字。
2、表示方法:点分十进制的IP地址之后写上端口号,中间用冒号隔开即可。
3、栗子: 192.23.23.23:8080

(3)TCP链接

1、每一条TCP链接唯一的被通信两段的两个端点(两个套接字)所确定
2、TCP 连接的端点是个很抽象的套接字,即(IP 地址:端口号)
3、同一个IP地址可以有多个不同的TCP连接,而同一个端口号也可以出现在多个不同的TCP连接中

二、可靠传输的工作原理基础

TCP发送的报文交付给下层的IP层,而IP层只提供尽最大努力服务,不保证传输的可靠性。这时TCP需要采取适当的措施才能保证传输的可靠。

理想假设下的可靠传输

1、传输信道不产生差错
2、不管发送发以多块的速度发送数据,接收方总是来得及处理收到的数据。

实际中采取的措施

实际的网络中。以上两种都不具备,但是我们可以采取一些可靠的协议进行控制。
1、当数据出现差错时,让接收方重传数据。
2、当接收方来不及接收数据时告诉发送方适当降低发送的速度。

1、停止等待协议

1、前面我们了解到TCP通信的特点之一是全双工通信,也就是通信的双方既是发送方也是接收方。
2、为了方便讨论 下图中A我们定为发送方B为接收方
3、其实每一层传递的数据单元我们都可以叫做分组。这里也以分组表示。

什么是停止等待协议?

1、停止等待协议:发送方每发完一个分组就停止发送,等待接收方确认,接收方收到分组后发送确认,在收到接收方的确认后再发送下一个分组。
2、超时重传:A只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组

要实现超时重传,就要在每发送完一个分组设置一个超时计时器。如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。

(1)停止等待协议:无差错情况
在这里插入图片描述
(2)停止等待协议:超时重传(出现差错时)
在这里插入图片描述

1、出现差错的可能情况:

1、B在接收到M1分组后检测分组错误,丢弃M1
2、M1在发送过程中发生了丢失。
ps:这两种情况下B什么也不会做的,也不会通知A收到有差错的分组。

2、超时重传时需要留意:

1、A发送完一个分组后需要暂时保留已发送的分组副本(在发生超时重传时可以使用),只有在收到相应的确认后才删除分组副本。
2、分组和确认分组要进行编号。这样可以明确哪一个发出的分组收到了确认。哪一个发出的分组没有收到确认。
3、超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些

(3)停止等待协议:确认丢失(出现差错)
在这里插入图片描述

可能出现的情况:
B收到M1分组后向A发动确认分组。但分组发送过程中丢失。A在超时计时器到达后就要重传分组M1。
假如这时B又收到了A发送的M1这时B要采取两个动作:

1、丢弃这个重复的分组,不向上层交付。
2、向A发送确认分组(每次收到分组时都要发送确认分组,不能认为收到过这个分组就不发送了。况且A之所以重传M1就是因为没有收到M1的确认)

(4)停止等待协议:确认迟到(出现差错)

在这里插入图片描述

可能出现的情况:
B收到A发送的M1,这时开始发送确认分组。但是发送确认分组时,这个分组由于某些原因传递的很慢,A的M1的超时计时器事件到了还没收到确认,这时A在发个M1,B收到M1发现这个M1重复,丢弃这个重复的M1,发送确认分组。这时A收到确认分组。继续发送分组M2…Mn这时这个龟速的M1分组终于收到了。。。
处理:

A收到迟到的确认分组,丢弃。

收获

1、通常A最终总是可以收到对所有发出的分组的确认。如果A不断重传分组但总是收不到确认,就说明通信线路太差,不能进行通信
2、使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信
3、上述的这种可靠传输协议常称为自动重传请求ARQ (Automatic Repeat reRuest)。意思是重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。

停止等待协议的优缺

优点点简单,缺点信道利用率低。
1、假定AB之间有一条直通道信道(利用率低)
2、采用流水线方式传输

1、流水线传输就是发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断地在传送。显然,这种传输方式可以获得很高的信道利用率。
2、当使用流水线传输时就要使用连续ARQ协议滑动窗口协议

2、连续的ARQ协议基础和滑动窗口初识

滑动窗口是TCP协议的精髓,后面总结,这里主要总结下连续的ARQ协议基础。

在这里插入图片描述

如上a所示:

1、这个表示发送方维持的滑动窗口
2、位于发送窗口内的5个分组都可以连续发送出去,而不需要等待对方确认。这样信道利用率提高。
3、上图有个时间坐标t,我们认为向前为时间增大的方向,向后为时间减小方向。
4、分组发送是按照分组序号从小到大发送。

(1)连续的ARQ协议规定

1、发送方:每收到一个确认分组,就把滑动窗口向前移动一个分组的位置。
2、接收方:采用累计确认方式。

1、累计确认解释:接收方法不必对收到的分组逐个发送确认,而是在收到分组后,对按序到达的最后一个分组发送确认。这就表示到这个分组为止的所有分组都已正确接收。
2、累积确认优点:容易实现,即使确认丢失也不必重传。
3、累计确认缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息
4、缺点栗子:如果发送方发送了前5个分组,而中间的第3个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。这就叫做Go-back-N(回退N),表示需要再退回来重传已发送过的N个分组。可见当通信线路质量不好时,连续ARQ协议会带来负面的影响

三、TCP报文的首部格式

1、虽然TCP的特点之一是面向字节流,但是TCP传送的数据单元却是报文段。
2、TCP报文段 = TCP首部 + TCP数据部分
3、TCP的首部十分重要,其前20个字节是固定的。首部的后面有4n(n为整数)个字节是根据需要而增加的可选项。因此TCP首部的最小长度玩为20字节。

在这里插入图片描述

TCP报文段图

(1)源端口、目的端口

各占两个字节,分别写入源端口号和目的端口号。和UDP类似TCP的分用也是通过端口实现的。

(2)序号

1、占四个字节
2、取值范围[0,2^32 - 1],当序号大于2^32 -1 时 序号会从0开始(里面进行了取余运算)。
3、TCP是面向字节流的。在一个TCP链接中,传送的每一个字节都是按照顺序编号的
4、要传送的字节流的起始编号必须在连接建立时设置。
5、序号值代表:报文段发送数据中第一个字节的序号。(如下序号图解)
6、序号也叫作报文段序号。

在这里插入图片描述

序号图解

例如:一报文段的序号字段值是301,而携带的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400。显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401。这个字段的名称也叫做“报文段序号”

(3)确认号

1、占四字节
2、期望收到的下一个报文中第一个字节号的序号。

(4)数据偏移

1、占4位
2、它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,即数据偏移表示首部的长度。
3、首部中还有长度不确定的选项字段,因此数据偏移字段是必要的

(5) 紧急URG (URGent)

当URG = 1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序来传送

(6)确认ACK (ACKnowlegment)

仅当ACK = 1时确认号字段才有效。当ACK = 0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1

(7)推送 PSH (PuSH)

当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,TCP就可以使用推送(push)操作

(8) 复位RST (ReSeT)

当RST = 1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。RST也可称为重建位或重置位。

(9)同步SYN (SYNchronization)

在连接建立时用来同步序号。当SYN = 1而ACK = 0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN = 1和ACK =1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。

(10)终止FIN

用来释放一个连接。当FIN = 1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。

(11)窗口

1、占两个字节,取值范围[0,2^16-1]
2、窗口:发送本段报文的接收窗口(非自己的发送窗口)
3、窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量

例如,设确认号是701,窗口字段是1000。这就表明,从701号算起,发送此报文段的一方还有接收1000个字节数据(字节序号是701~1 700)的接收缓存空间

4、窗口字段明确指出了现在允许对方发送的数据量。窗口值是经常在动态变化着

(12)检验和

1、占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP类似。
2、应把伪首部第4个字段中的17改为6 (TCP的协议号是6),把第5字段中的UDP长度改为TCP长度。

(13)紧急指针

1、占2字节。紧急指针仅在URG = 1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)

(14)选项

1、长度可变,最长可达40字节。当没有使用“选项”时,TCP的首部长度是20字节
2、TCP最初只规定了一种选项,即==最大报文段长度 MSS ==(Maximum Segment Size) [RFC 879]。请注意MSS这个名词的含义。MSS是每一个TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是整个TCP报文段的最大长度,而是“TCP报文段长度减去TCP首部长度
3、随着因特网的发展,又陆续增加了几个选项。如窗口扩大选项、时间戳选项等[RFC 1323]。以后又增加了有关选择确认(SACK)选项[RFC 2018]。这些选项的位置都在图5-14所示的“选项”字段中。

四、TCP可靠传输的实现

五、TCP的流量控制

六、TCP的拥塞控制

七、TCP的链接管理

未完 待续!!!

猜你喜欢

转载自blog.csdn.net/qq_38350635/article/details/104001439
今日推荐