TCP是在不可靠的IP层之上实现的可靠的数据传输协议,它主要解决传输的可靠、有序、无丢失和不重复问题
1.TCP是面向连接(虚连接)的传输层协议
2.每条TCP连接只能有两个端点,每条TCP连接只能是点对点的(一对一)
3.TCP提供可靠的交付服务,保证传送的数据无差错、不丢失、不重复且有序
4.TCP提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据,为此TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据
*发送缓存:准备发送的数据&已发送但尚未收到确认的数据
*接收缓存:按序到达但尚未被接受应用程序读取的数据&不按序到达的数据
5.TCP是面向字节流的。TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。
TCP传送的数据单元称为报文段
作用:运载数据;建立连接、释放连接和应答
1.源端口和目的端口字段:各占2B,端口是传输层与应用层的服务接口,传输层的复用和分用功能都要通过端口实现
2.序号字段
(1)占4B,TCP是面向字节流的(即TCP传送时是逐个字节传送的),所以TCP连接传送的数据流中的每个字节都编上一个序号。对每个字节进行编号,但并不是接收到每个字节都要发回确认,而是在发送一个报文段的字节后才发回一个确认,所以TCP采用的是对报文段的确认机制。
(2)序号字段的值指的是本报文段所发送的数据的第一个字节的序号
*注:UDP提供不可靠的传输服务,不需要对报文编号,因此不会有序列号字段
3.确认号字段ack:占4B,是期望收到对方的下一个报文段的数据的第一个字节的序号(确认号为N表示前N-1个数据均已正确收到)
4.数据偏移(即首部长度):占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。以4B位单位,即1个数值是4B。当偏移取最大时TCP首部长度为15×4=60B。由于使用填充,所以长度总是4B的倍数。因此报头长度20~60B,其中固定部分为20B
5.保留字段:占6位,保留为今后使用
6.紧急位URG:URG=1时,表明紧急指针字段有效。它告诉系统报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
7.确认位ACK
ACK=1时确认号字段才有效
ACK=0时确认号无效
tcp规定,在连接建立后所有传送的报文段都必须把ack置1
8.推送位PSH(Push):接收TCP收到PSH=1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满后再向上交付
9.复位位RST(Reset):RST=1时,表明TCP连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接
10.同步位SYN:SYN=1表示这是一个连接请求或连接接受报文
11.终止位FIN(Finish):用来释放一个连接。FIN=1表明此报文段的发送方的数据已发送完毕,并要求释放传输连接
12.窗口字段:占2B,表示允许对方发送的数据量,单位为字节
13.校验和:占2B,校验和字段检验的范围包括首部和数据两部分。检验时要加上12B伪首部,第四个字段(协议字段)为6
14.紧急指针字段:占16位,指出在本报文段中紧急数据共有多少字节(紧急数据放在本报文段数据的最前面)
15.选项字段:长度可变,TCP最初只规定了一种选项,即最大报文段长度
16.填充字段:使整个首部长度是4B的整数倍
TCP连接的管理就是使运输连接的建立和释放都能正常进行,分为:连接建立、数据传送、连接释放。TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器。TCP传输连接建立后,客户端与服务器端的应用进行进行全双工的字节流传输。参与TCP连接的两个进程中的任何一个都能提出释放连接的请求。如果主机1的进程以端口x和主机2的端口y建立了一条TCP连接,这时如果希望再在这两个端口间建立新的TCP连接,则会建立失败,但不影响先建立连接的传输。
1.TCP连接时面对的问题
(1)要使每一方都能够确知对方的存在
(2)要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项、时间戳选项及服务质量等)
(3)能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配
2.连接的建立(三次握手)
服务器易于受到syn洪泛攻击
(1)客户机的TCP首先向服务器的TCP发送一个连接请求报文段。无应用层数据。
SYN=1 (SYN=1表示这是一个连接请求或连接接受报文)
seq=x (随机产生)(占4B,序号字段指的是本报文段所发送的数据的第一个字节的序号)
(2)服务器的TCP收到连接请求报文段后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。无应用层数据。
SYN = 1(SYN=1表示这是一个连接请求或连接接受报文)
ACK = 1 (ACK=1时确认号字段才有效)
ack= x+1 (确认号字段ack:是期望收到对方的下一个报文段的数据的第一个字节的序号)
seq= y (随机产生)(序号字段指的是本报文段所发送的数据的第一个字节的序号)
(3)当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。此时可以携带数据。
SYN=0 (非连接请求或连接接受报文,置为0)
ACK = 1
ack=y+1
seq = x+1
3.SYN洪泛攻击
SYN洪泛攻击发生在OSI第四层(传输层),这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认。那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。
影响:浪费服务器的资源;在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机。
4.连接的释放(四次挥手)
(1)客户机向其TCP发送一个连接释放报文段,并停止发送数据,主动关闭TCP连接
FIN = 1 (终止位FIN用来释放一个连接。FIN=1表明此报文段的发送方的数据已发送完毕,并要求释放传输连接)
seq = u (占4B,序号字段指的是本报文段所发送的数据的第一个字节的序号)
(2)服务器收到连接释放报文段后即发出确认
ACK =1 (ACK=1时确认号字段才有效)
seq = v
ack = u+1 (确认号字段ack:占4B,是期望收到对方的下一个报文段的数据的第一个字节的序号)
(3)服务器通知客户端TCP释放连接
FIN = 1
ACK = 1
seq = w
ack =u+1 (客户端没有发送数据,因此ack与上阶段相同)
(4)客户机收到连接释放报文后,发出确认。再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭。
ACK = 1
seq = u+1
ack = w+1
1.校验
与UDP校验一样,增加伪首部
2.序号
一个字节占一个序号。TCP首部的序号字段用来保证数据能有序提交给应用层,序号建立在传送的字节流之上
3.确认
(1)TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号
(2)TCP默认使用累计确认,即TCP只确认数据流中至第一个丢失字节为止的字节
4.重传
(1)超时:TCP每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但还未收到确认时,就要重传这一报文段
*重传时间:TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间)
(2)冗余ACK:再次确认某个报文段的ACK,而发送方先前已经收到过该报文段的确认;当收到对于某个报文段的3个冗余ACK,可以认为该报文段已经丢失。这时发送方可以立即对该报文执行重传
匹配发送方的发送速率与接收方的读取速率
1.流量控制机制
基于滑动窗口协议的流量控制机制
实现方法
(1)接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小(接收方设置确认报文段的窗口字段来将接收窗口rwnd通知给发送方),限制发送方向网络注入报文的速率。
(2)发送方根据其对当前网络拥塞程序的估计而确定的窗口值,这称为拥塞窗口cwnd,其大小与网络的带宽和时延有关。
*注:发送方的发送窗口大小=min{接收窗口rwnd,拥塞窗口cwnd}
窗口的大小是字节,发送窗口值表示当前还能传多少东西出去,发送缓存>发送窗口
总结:
①接收窗口rwnd:接收方根据目前接收缓存大小所许诺的最新窗口值,反映接收方的容量
②拥塞窗口cwnd:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络的当前容量
TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段。接收方收到探测报文段时给出现在的窗口值。
2.流量控制的区别
(1)传输层:定义端到端用户之间的流量控制
(2)数据链路层:定义两个中间的相邻结点的流量控制
3.窗口大小的区别
(1)传输层:滑动窗口可以动态变化
(2)数据链路层:滑动窗口不能动态变化
六.TCP拥塞控制
防止过多的数据注入网络,保证网络中的路由器或链路不致过载
拥塞:对资源需求的总和>可用资源
1.流量控制与拥塞控制
流量控制 | 拥塞控制 | |
相同点 | 它们都通过控制发送方发送数据的速率来达到控制效果 | |
不同点 | 点对点的通信量的控制,即接收端控制发送端,它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收 | 让网络能够承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素 |
2.实现机制
一个传输轮次(=RTT):发送了一批报文段并收到它们的确认的时间。也作为开始发送一批拥塞窗口内的报文段到开始发送下一批拥塞窗口内的报文段的时间。
【慢开始与拥塞避免】
(1)第一段慢开始
每经过一个传输轮次(即往返时延RTT),拥塞窗口cwnd就会加倍(×2)
(2)第一段拥塞避免
到达ssthresh初始值后,发送端的拥塞窗口cwnd每经过一个往返时延RTT就增加一个MSS的大小(每次+1)
(3)第二段慢开始
将cwnd设置为1,后面同第一段
(每经过一个传输轮次,拥塞窗口cwnd就会加倍)
(4)第二段拥塞避免
新的ssthresh值设置为当前cwnd的一半,后面同第一段
(到达新的ssthresh后,发送端的拥塞窗口cwnd每经过一个往返时延RTT就增加一个MSS的大小(每次+1))
【快重传与快回复】
(1)快重传
当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时
(2)快恢复
发送端收到连续三个冗余ACK(即重复确认)时,执行”乘法减小”算法,把慢开始门限ssthresh设置为出现拥塞时发送方cwnd的一半(24变为12),把cwnd的值设置为慢开始门限ssthresh改变后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大(每次+1)
[例1]
假设图中的H3访问Web服务器S时,S为新建的TCP连接分配了20 KB(K=1 024)的接收缓存,最大段长MSS=1 KB,平均往返时间RTT=200 ms。H3建立连接时的初始序号为100,且持续以MSS大小的段向S发送数据,拥塞窗口初始阈值为32 KB;S对收到的每个段进行确认,并通告新的接收窗口。假定TCP连接建立完成后,S端的TCP接收缓存仅有数据存入而无数据取出。请回答下列问题。
(1)在TCP连接建立过程中,H3收到的S发送过来的第二次握手TCP段的SYN和ACK标志位的值分别是多少?确认序号是多少?
答:(1)SYN=1,ACK=1,确认序号101
(2) H3收到的第8个确认段所通告的接收窗口是多少?此时H3的拥塞窗口变为多少?H3的发送窗口变为多少?
答:(2)在慢开始算法里,发送方H3先设置拥塞窗口cwnd=1KB,接下来每收到一个对新报文段的确认就使发送方的拥塞窗口加1KB。
全过程分析:
①初始
拥塞窗口cwnd:1
接收窗口rwnd:20
发送窗口twnd(取min):1
②经过一个RTT,发出1个数据
收到第1个确认段
拥塞窗口cwnd:2
接收窗口rwnd:19
发送窗口twnd:2
③经过一个RTT,发出2个数据
【发第一个数据】
收到第2个确认段
拥塞窗口cwnd:3
接收窗口rwnd:18
发送窗口twnd:3
【发第二个数据】
收到第3个确认段
拥塞窗口cwnd:4
接收窗口rwnd:17
发送窗口twnd:4
④经过一个RTT,发出4个数据
【发第一个数据】
收到第4个确认段
拥塞窗口cwnd:5
接收窗口rwnd:16
发送窗口twnd:5
【发第二个数据】
收到第5个确认段
拥塞窗口cwnd:6
接收窗口rwnd:15
发送窗口twnd:6
【发第三个数据】
收到第6个确认段
拥塞窗口cwnd:7
接收窗口rwnd:14
发送窗口twnd:7
【发第四个数据】
收到第7个确认段
拥塞窗口cwnd:8
接收窗口rwnd:13
发送窗口twnd:8
⑤经过一个RTT,发出8个数据
【发第一个数据】
收到第8个确认段
拥塞窗口cwnd:9
接收窗口rwnd:12
发送窗口twnd:9
【发第二个数据】
拥塞窗口cwnd:10
接收窗口rwnd:11
发送窗口twnd:10
【发第三个数据】
拥塞窗口cwnd:11
接收窗口rwnd:10
发送窗口twnd:10
【发第四个数据】
拥塞窗口cwnd:12
接收窗口rwnd:9
发送窗口twnd:9
【发第五个数据】
拥塞窗口cwnd:13
接收窗口rwnd:8
发送窗口twnd:8
【发第六个数据】
拥塞窗口cwnd:14
接收窗口rwnd:7
发送窗口twnd:7
【发第七个数据】
拥塞窗口cwnd:15
接收窗口rwnd:6
发送窗口twnd:6
【发第八个数据】
拥塞窗口cwnd:16
接收窗口rwnd:5
发送窗口twnd:5
⑥经过一个RTT,发出5个数据
【发第一个数据】
拥塞窗口cwnd:17
接收窗口rwnd:4
发送窗口twnd:4
【发第二个数据】
拥塞窗口cwnd:18
接收窗口rwnd:3
发送窗口twnd:3
【发第三个数据】
拥塞窗口cwnd:19
接收窗口rwnd:2
发送窗口twnd:2
【发第四个数据】
拥塞窗口cwnd:20
接收窗口rwnd:1
发送窗口twnd:1
【发第五个数据】
拥塞窗口cwnd:21
接收窗口rwnd:0
发送窗口twnd:0
因此可得,H3收到的第8个确认段所通告的接收窗口是12KB,此时H3的拥塞窗口变为9KB,H3的发送窗口变为9KB
也可直接计算:H3收到的第8个确认段所通告的接收窗口是20-8=12KB。H3共收到8个确认段,所以此时H3的拥塞窗口为1+8=9。发送窗口=min{拥塞窗口,接收窗口},所以H3的发送窗口变为min{9,12}=9KB。
(3)当H3的发送窗口等于0时,下一个待发送的数据段序号是多少?H3从发送第1个数据段到发送窗口等于0时刻为止,平均数据传输速率是多少(忽略段的传输延时)?
答:(3)由上述分析得,发送窗口为0KB时,接收窗口为0KB,共发送了20KB,初始序号为100,发送第一个数据的序号为101,发送第二个数据的序号为101+20K,发送第20个数据的序号是101+19×20K,因此下一个待发送的序号是101+20×1024=20581
(4)若H3与S之间通信已经结束,在t时刻H3请求断开该连接,则从t时刻起,S释放该连接的最短时间是多少?
答:(4)当通信结束后,H3向S发送连接释放报文段(0.5RTT)。S收到H3的连接释放报文段后,马上发出确认报文段(0.5RTT)。此时若S无数据发送则连接释放的时间最短。S立刻发出连接释放报文段(和上个同时发出)。H3在收到S的连接释放报文段后,发出确认报文段(0.5RTT)。共计1.5RTT=1.5×200ms=300ms
[例2]
假设客户C和服务器S已建立一个TCP连接,通信往返时间RTT=50ms,最长报文段寿命MSL=800ms,数据传输结束后,C主动请求断开连接。若从C主动向S发出FIN段时刻算起,C和S进入CLOSE状态所需的时间至少分别为_____
解:
客户机:RTT+2MSL=1650ms
服务器:1.5RTT=75ms