TCP 首部:
此次我们要讨论的就是其中的状态标识
URG:紧急指针有效。
ACK:确认序号有效。
PSH:接收方应尽快将报文段交给应用层。
RST:复位连接。
SYN:同步序号,用来发起一个连接。
FIN:发送端完成发送任务。
URG
紧急方式,使连接的一端可以告诉另一端有些具有某种方式的”紧急数据”已经放置在普通的数据流中。
另一端被通知这个紧急数据已被放置在普通的数据流中,处理方式由接收方决定。
URG比特被置1,并且紧急指针被置为一个正的偏移量,偏移量与TCP首部的序号字段相加,得出紧急数据的最后一个字节的序号。
TCP 通知接收进程:
何时接收到一个紧急数据指针。
何时某个紧急数据指针还不在此连接上。
紧急指针是否在 数据流中向前移动。
接收进程读取数据流并被告知何时碰到了紧急数据指针。
只要从当前读取位置到紧急数据指针之间有数据存在 ,就认为程序处于紧急方式。
TCP 本身并不知道紧急数据从数据流的何处开始,TCP 通过连接传送的唯一信息就是紧急方式已经开始和指向紧急数据最后一个字节的指针。其他的事情留给应用程序去处理 。
ACK
确认字符,当接收方成功收到数据,那么会回复一个ACK报文。
通常 ACK 有自己固定的格式,长度大小。
ACK可以和 SYN,FIN等同时使用。
PSH
发送方使用 PSH 标志通知接收方将所收到的数据全部提交给接收进程。
这些数据包括与 PSH 一起传送的数据以及接收方已经接收到的其他数据。
客户端应用程序通知 TCP 设置 PSH 标志,TCP 通知服务器不需要等待额外数据而使已提交数据在缓存中滞留。
服务器收到带有 PSH 标志的报文,立即将这些数据交给服务器而不等待判断是否还有额外的数据到达。
RST
RST 用于复位 — 异常的关闭连接。
发送 RST 包关闭连接时,不必等待缓冲区的包都发出去,直接丢弃缓冲区的包发送 RST 包。
接收端接收到 RST 包时,也不必发送 ACK 来确认。
TCP处理程序会在自己认为的异常时刻发送RST包。例如,A向B发起连接,但B之上并未监听相应的端口,这时B操作系统上的TCP处理程序会发RST包。
异常终止一个连接的优点:
1. 丢弃任何待发送数据并立即发送复位报文段。
2. RST 接收方会区分另一端执行的是异常关闭还是正常关闭。
SYN
SYN 是 TCP 建立连接时使用的握手信号,在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN+ACK 应答表示接收到了这个消息。最后客户机再以 ACK 作为响应。
SYN攻击:
SYN 攻击利用TCP协议缺陷,发送了大量伪造的TCP连接请求,使得被攻击方资源耗尽,无法及时回应或处理正常的服务请求。一个正常的TCP连接需要三次握手,首先客户端发送一个包含SYN标志的数据包,其后服务器返回一个SYN/ACK的应答包,表示客户端的请求被接受,最后客户端再返回一个确认包ACK,这样才完成TCP连接。在服务器端发送应答包后,如果客户端不发出确认,服务器会等待到超时,期间这些半连接状态都保存在一个空间有限的缓存队列中;如果大量的SYN包发到服务器端后没有应答,就会使服务器端的TCP资源迅速耗尽,导致正常的连接不能进入,甚至会导致服务器的系统崩溃。
FIN
发送 FIN 只意味着在这一个方向上没有数据流动,通常是应用层进行关闭的结果。
因此每个方向必须单独的进行关闭。
客户端发送一个 FIN,用来关闭从客户到服务器的数据传送。
服务器收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加1。
同时 TCP 还向应用程序传送一个文件结束符。接着服务器发送一个 FIN 报文段。
客户端收到 FIN 后,发回一个 ACK 确认报文段。