目录
传输层的功能TCPTCP头部可靠传输机制连接管理与状态转移三次握手四次挥手状态转移
拥塞控制窗口慢启动拥塞避免快重传和快恢复
流量控制异常情况
传输层的功能
提供端到端的逻辑通信:这种通信实质上是进程之间的通信,区别网络层主机之间的逻辑通信;复用与分用:对于下层协议网络层,只提供主机之间的通信,但无法区别不同进程之间的通信,于是传输层需要实现进程之间的通信,则需要额外机制,具体而言:
复用:指的是不同进程可以使用同一个传输层协议进行;发送方的传输层将多个进程的数据“打包”到同一个网络传输中,并通过不同端口号进行区分;分用:接收方的传输层在剥去报文的首部并根据首部端口号将数据交付到正确的目的应用进程。 差错检测:首部和数据部分都需要检测
TCP
TCP头部
TCP头部字段为固定部分为20B,可选部分最多40B,最大长度为60B;下面介绍一下基本的字段含义;
源端口号与目的端口号:范围1-65535,并分为了以下几类:
公认端口:1-1023,绑定一些明确服务,不可普通用户进程绑定,例如:21:FTP,22:SSH,23:telant,53:DNS,80:HTTP,110:POP3;注册端口,1024-49151,用户注册绑定动态和/或私有端口:从49152到65535。理论上,不应为服务分配这些端口。 序号:某一个传输方向数据部分的起始字节序号;
确认号:用于告诉对方期待下一次发送的起始字节号,若自身已经确认收到前N个字节,那么发送的确认号就应该是N+1;配合ACK标志使用。
头部长度: 单位 4B,因为TCP最大头部长度就是60B,所以只需要4位。一总八片首四;
URG:紧急标志位,置为1是告诉对方此条TCP报文需要紧急处理,配合紧急指针使用
ACK:确认标志位,告诉对方此报文是确认报文段。
PSH:告诉接收方,将接受缓冲区的数据理解全部取走。
RST:重连标志位,要求对方重新连接。
SYN:同步标志位,用于请求连接,同步报文段,三次握手的前两次握手;
FIN:结束标志位,告诉对方本端将终止连接。
窗口大小(16位),告诉对方本段还能接受多少字节数据,用于TCP流量控制
校验和(16位),CRC校验,发送端进行填充
紧急指针(16位),数据部分的前一部分为紧急数据,最后一个紧急数据的序号为:
最后一个紧急数据序号值
=
序号
+
紧急指针
−
1
最后一个紧急数据序号值 = 序号+紧急指针 - 1
最后一个紧急数据序号值=序号+紧急指针−1 例如:序号1000,紧急指针为200,那么1000-1199则为紧急数据; 另外紧急数据也算在确认字节序里面,也就是如果收到1000的序号,其中前200为紧急数据,后800(1200-1999)为普通数据,回传的确认报文序号依旧为2000;
可选字段,该部分主要能够提供的有:数据填充(总长度填充为4B的整数倍),协商报文最大长度选项,窗口扩大因子选项等等;具体待补充;
可靠传输机制
差错检验:依靠头部的CRC校验码实现序号机制:网络层的传输是无序发送的,接受端需要进行重新排序;累计确认:对于已收到的字节流确认其序号,例如收到1-999,1000-1999,2000-2499的数据部分,只需发送一个确认号为2500的ACK报文,不需要发送三个ACK;通常与延迟确认一同使用,减少网络中的ACK包;超时重传:对于每一个发送报文,都会设有一个定时器,若在一定时间内未收到确认报文,则进行重新发送并重置计时器,
定时器时间设定:超时时间的设计RTO一定要大于2倍的连接往返的最大时间RTT;多次重传失败:指数退避算法,[1,2,4,…]*RTO进行重传,linux最大为5次,windows最大为10次;若依旧失败,则会会发送RST重置连接报文;
连接管理与状态转移
三次握手
第一次握手:SYN报文,客户端向服务器端口发送同步报文(SYN),其中的初始序号ISN是随机的(抵御序列号预测攻击)第二次握手:ACK+SYN报文,初始序号ISN随机第三次握手:三次握手的最后一步,用于确认服务端的初始随机序号,虽然看起来第三次握手可以捎带数据传输,但实际上好像没见多少用过;
Socket和IP:PORT的关系
socket由四元组唯一确定(本机IP, 本机端口, 对方IP, 对方端口);除TIME_WAIT情况,在server端时,会出现一个监听Socket,其四元组为(本机IP, 本机端口, 0.0.0.0, 0),对方IP与端口表示任意;而连接socket则会有实际的对方IP与对方端口;在TIME_WAIT情况下,可能会出现旧连接未释放,新连接就已经开始建立;
四次挥手
第一次握手:主动关闭方进如FIN_WAIT-1阶段,接受放收到后进入close_wait阶段,等待还没传完的数据传完第二次“握手”:继续传输内核发送缓冲区的所有剩余数据。主动关闭方在发送FIN后仍收到普通数据,进入FIN_WAIT-2;第三次握手:被动关闭方发送完缓冲区的数据之后,发送FIN的ACK报文段,进入LAST_ACK,第四次握手:FIN_WAIT-2的主动关闭方发送最后一个ACK,进入TIME_WAIT阶段; TIME_WAIT的作用:主动关闭方需要等待2MSL(2倍最大分段生存时间),这段时间是为了处理网络上能存在延迟或重传的旧报文(如之前未被接收的ACK或数据段)
孤儿连接 孤儿连接指的是双方连接过程中,有一方终止连接(假设客户端中途断开),而另外一端依然保持活跃阶段,但服务端未感知到,且认为连接依然有效,导致这个端口资源一直被占用。可能出现的阶段会在Established或FIN_WAIT阶段;
操作系统的解决方案: 1. TCP探测保活帧(Keep-Alive),定时发送探测报文; 2. 超时重传 3. 进程退出时的资源回收
状态转移
连接阶段的状态转移:这边认为都是CLient主动连接与关闭 CLient: SYN_SENT
→
\rightarrow
→ (发送ACK)
→
\rightarrow
→ESTABLISHED Server: LISTEN
→
\rightarrow
→SYN_RCVD
→
\rightarrow
→ESTABLISHED
ESTABLISHED阶段的数据交互
终止阶段的状态转移: CLient: (发送FIN)FIN_WAIT_1
→
\rightarrow
→(收到非FIN的ACK)
→
\rightarrow
→FIN_WAIT_2
→
\rightarrow
→(收到FIN的ACK,发送最后的ACK)
→
\rightarrow
→TIME_WAIT
→
\rightarrow
→CLOSE Server: (接受到FIN)CLOSE_WAIT
→
\rightarrow
→(继续发送缓冲区数据)
→
\rightarrow
→(发送FIN的ACK)
→
\rightarrow
→LAST_ACK
→
\rightarrow
→(收到最后的ACK)
→
\rightarrow
→CLOSE
拥塞控制
TCP发送的数据不可能无限大,网络的承载能力有限,但网络上的数据太多时,会出现拥塞现象;同时接受方开辟的缓冲区数据大小有限,一次发送过多数据,会导致数据还没被读出缓冲区就被覆盖;
窗口
TCP头部字段的窗口大小部分,用于告诉对方本端缓冲区还能收纳的数据;在双方通信过程中,会有几个窗口定义
发送窗口SWND(Send Window): 自身还能够发送的数据量大小;接受窗口RWND(Receive Window):收到接受方其还能继续承受接受的数据大小;拥塞窗口CWND(Congestion Window0): 网络自身调控,慢启动算法,快恢复算法调控;
发送窗口大小
=
M
i
n
(
接受窗口
,
拥塞窗口
)
发送窗口大小 = Min(接受窗口, 拥塞窗口)
发送窗口大小=Min(接受窗口,拥塞窗口) 也就是我们经常看的那个公式:
S
W
N
D
=
M
i
n
(
R
W
N
D
,
C
W
N
D
)
SWND = Min(RWND, CWND)
SWND=Min(RWND,CWND)
对于接受窗口这种有多少就告诉对方我还能接受多少的RWND,这种我们不关注;关注的是发送窗口和拥塞窗口的大小应该怎样去设置更能适应网络;此处引入另外的概念:
MSS发送最大报文段: 指的是发送者发送的报文段中的最大数据量大小;ssthresh:慢启动门限阈值
慢启动
在TCP刚开始连接的时候,发送窗口的大小会设置成一个初始值IW,这边我们设定为1(MSS),但新的linux提高了这个初始值。 之后发送方每收到一个报文段的确认ACK,cwnd都会进行如下计算:
C
W
N
D
+
=
m
i
n
(
N
,
M
S
S
)
CWND += min(N,MSS)
CWND+=min(N,MSS) 此处N代表的是此次确认时之前还未被确认的报文段;按正常最大报文而言,每收到一个报文段ACK,CWND都会+1.那么在一个轮次,CWND就会指数级增长; 例如:
1轮次: cwnd=1,发送1个报文段,12轮次:收到前一轮的1个报文段ACK,cwnd+1 = 2,此时发送2个报文段, 1
→
\rightarrow
→ 23轮次:收到前一轮的2个报文段的ACK,cwnd+1+1 = 4, 此时发送4个报文段,2
→
\rightarrow
→ 4依次类推,呈指数级增长。 另外,指数级增长不能越过ssthresh,
拥塞避免
当超过明显阈值时,使用拥塞避免算法,每一个轮次cwnd只会进行+1;
网络拥塞的处理 当传输超时 检测到网络出现拥塞时,慢启动和拥塞避免的策略时,ssthresh变为发生拥塞时CWND的一半,CWND则变为1; 当 收到重复ACK时,则会进行快重传和快恢复;
快重传和快恢复
当收到3个重复ACK时,执行快重传与快回复,ssthresh变为发生拥塞时CWND的一半,但CWND变为门限阈值ssthresh,之后执行拥塞避免算法;
流量控制
滑动窗口当中,只有处于窗口最左侧的报文段收到确认帧,窗口才能继续向前;
异常情况
SYN洪范攻击:利用TCP三次握手协议的特性,通过向目标服务器发送大量伪造的SYN请求,迫使服务器维持大量未完成的“半连接”状态,最终耗尽服务器资源(如内存、连接数、CPU等),导致正常用户无法建立连接。 防御手段:SYN Cookie
SYN cookie 通过延迟分配连接资源来避免半连接耗尽当服务器收到SYN报文时,不立即分配内存存储连接状态,而是生成一个“加密的Cookie”(包含时间戳、随机数等信息),并将其作为初始序列号(ISN)返回给客户端(在SYN+ACK报文中);若客户端发送合法的ACK(包含正确的Cookie),服务器验证Cookie有效性后,再分配资源建立连接;若客户端未发送ACK(攻击者的SYN),服务器无需保留连接状态,Cookie过期后自动丢弃。 To be continue ;