TCP连接的建立与终止
一个TCP连接由一个四元组构成,分别是两个IP和两个端口号。一个TCP连接分为三个阶段:启动、数据传输、关闭。
- 主动开启(三次握手):
- 客户机–>服务器(SYN=1,Seq=c)
- 服务器–>客户机(SYN=1,ACK=c+1,Seq=d)
- 客户机–>服务器(ACK=d+1,Seq=c+1)
- 关闭(四次握手)
- 客户机–>服务器(FIN=1,Seq=K,ACK=L)
- 服务器–>客户机(ACK=K+1,Seq=L)
- 服务器–>客户机(FIN=1,Seq=L,ACK=K+1)
- 客户机–>服务器(ACK=L+1,Seq=K)
TCP半关闭
在TCP半关闭操作中,连接一个方向被关闭,另一个方向仍在传输数据直到他被关闭为止。
- 客户机–>服务器(FIN=1,Seq=K,ACK=L)
- 服务器–>客户机(ACK=K+1,Seq=L)
- 服务器–>客户机(数据);客户机–>服务器(确认)
- 服务器–>客户机(FIN=1,Seq=L,ACK=K+1)
- 客户机–>服务器(ACK=L+1,Seq=K)
同时打开与关闭
同时打开中交换的报文段。与正常连接建立过程相比需要增加一个报文段。数据包的SYN位将置位直到接收到一个ACK数据包位置。
- A–>B(SYN=1,Seq=c1)同时B–>A(SYN=1,Seq=c2)
- A–>B(SYN=1,ACK=c2+1,Seq=c1)同时B–>A(SYN=1,ACK=c1+1,Seq=c2)
TCP选项
TCP头部包含了多个选项,选项列表结束(EOL)、无操作(NOP)以及最大段大小(MSS)是定义与原始TCP规则中的选项。
最大段大小选项
最大段大小是指TCP协议所允许从对方接受到的最大报文段,因此这也就是通信对方在发送数据时能使用的最大报文段。最大段大小只记录TCP数据的字节数而不包括TCP与IP头部。在没有事先声明的情况下,最大段大小默认数值位536。
选择确认选项
TCP“选择确认”选项可以解决“空洞现象”,当接收到乱序的数据时,他能提供一个SACK选项来描述这些乱序的数据,从而帮助对方有效地进行重传。
窗口缩放选项
窗口缩放选项能够有效地将TCP窗口广告字段的范围从16位添加至30位。TCP头部不改变窗口广告字段的大小,使用另一个选项作为比例因子。该选项出现于一个SYN报文段中,连接建立以后比例因子是与方向绑定的。
时间戳选项与防回绕序列号
时间戳选项(TSOPT),2个四字节的时间戳数值,允许每一个发送方针对每一个接收到的ACK估算TCP连接的往返时间。估算一条TCP连接的往返时间主要是为了设置重传超时。同时避免接受旧报文段与判断报文段正确的方法(报文段二义性),又称为防回绕序列号。
用户超时选项
用户超时(UTO)选项指明了TCP发送者在确认对方未能成功接受数据之前愿意等待该数据ACK的时间。
认证选项
用于增强连接的安全性,不仅采用各种加密算法,还使用“带内”信令来确认密钥是否改变。
TCP路径最大传输单元发现
路径最大传输单元(MTU)只经过两台主机之间路径的所有网络报文段中最大传输单位的最小值。知道最大传输单元有助于一些协议避免分片。
TCP状态转换
一个TCP连接启动与终止的规则,这些规则其实是又TCP所属的状态决定的。
TCP状态转换图
- (SYN_SENT)客户端—(SYN K)–>服务器(LISTEN->SYN_RECVD)
- 服务器–(SYNL,ACK K+1)–>客户端(ESTABLISHED)
- 客户端—(ACK L+1)–>服务器(ESTABLISHED)
- 数据传输发生在ESTABLISHED状态
- 客户端(FIN_WAIT_1)----(FIN M)—> 服务器(CLOOSE_WAIT)
- 服务器----(ACK_M+1)—> 客户端(FIN_WAIT_2)
- 服务器(LAST_ACK)–(FIN N)—>客户端(TIME_WAIT)
- 客户端(2msl计时器后CLOSED)-----(ACK N+1)—>服务器(CLOSED)
TIME_WAIT状态
TIME_WAIT状态也曾为2ML等待状态。该状态中,TCP将会等待两倍于较大段生存期的时间,有时也称作加倍等待时间。
当TCP执行一个主动关闭并发送最终的ACK时,连接必须处于TIME_WAIT状态并持续两倍于最大生存期的时间。
当一个连接处于2ML等到状态时,任何延迟到达的报文段都将被丢弃。
静默时间的概念
FIN_WAIT_2状态
同时打开与关闭的转换
同时打开:双方同时发送一个SYN报文段,进入SYN_SENT状态,然后同时接受到对方的SYN,变为SYN_RCVD,然后同时发送ACK,确认ACK之后同时变成ESTABLISHED。
同时关闭:同时发送FIN,变为FIN_WAIT_1,然后同时发送ACK变成CLOSING,同时接收变成TIME_WAIT。等待一段时间后变成2ML状态。
重置报文段
当发现一个到达的报文段对于相关连接而言是不正确时,TCP就会发送一个重置报文段。
针对不存在端口的连接请求
若服务器不存在此端口号,接收到客户机的SYN报文段后会回复RST字段的报文。
终止一条连接
终止一条连接的方法可以是通信放发送一个FIN,这种方法有时称为有序释放。
在任何时刻我们都可以通过发送一个重置报文段来代替FIN终止一条连接。这种方式有时候叫做 终止释放
终止一条连接有两大特性:
(1)任何排队的数据都会被抛弃,一个重置报文段被立即发送出去;
(2)重置报文段的接收方会说明通信另一端采取了终止的方式不是一次正常连接。
半开连接
当某一台主机的电源被切断而不是正常关机时候会出现半开连接。
当一个主机崩溃重启后将忘记之前的TCP连接,这时如果接受到崩溃前的信息,将会给对方发送一条重置报文段作为相应。
时间等待错误
客户机在TIME_WAIT状态下对于滞留网络时间比较久的报文做出应答,但是这时候服务器已经处于CLOSED状态,服务器将会发送一个重置报文段让客户机进行关闭。
TCP服务选项
TCP端口号
TCP依靠四元组多路分解获得报文段。目的IP端口号,源IP端口号,有一个不同极为不同连接。(也就是说同一个IP同一个端口号,可以和很多主机或者同一个主机的不同端口进行连接)。
限制本地IP地址
进入连接队列
一个并行的服务器会为每一个客户端分配进程或线程,为了避免SYN洪范攻击之类的问题,把进入应用程序之前的连接分为两类:
- 连接尚未完成,但是已经收到SYN
- 完成三次握手并处于ESTABLISHED
操作系统会为以上两种情况使用两种不同的连接
linux有以下规则:
- SYN_SEND连接数目超过一定阀值时,拒绝新的连接。
- 限制未完成连接(完成三次握手,未被应用程序接受)数量。
- 未被应用程序接受的连接如果接收到数据,则先放入队列缓存。
- 如果队列已经没有足够的空间分配给新的连接,TCP会延迟对SYN的响应。
与TCP连接管理相关的攻击
- SYN泛洪是一种TCP拒绝服务攻击,这种攻击中一个或多个恶意客户端产生一系列TCP连接尝试(SYN报文段),并将它们发送给一台服务器,通常采用“伪造”源IP地址。
SYN cookie可以有效针对上述连接。 - 路径最大传输单元,设置一个非常小的MSS。
- 破坏现有的TCP连接