简简科技:TCP挥手过程及原理,「网络传输」一文搞懂( 二 )


(B)ACK:确认序号有效 。
(C)PSH:接收方应该尽快将这个报文交给应用层 。
(D)RST:重置连接 。
(E)SYN:发起一个新连接 。
(F)FIN:释放一个连接 。
需要注意的是:
(A)不要将确认序号Ack与标志位中的ACK搞混了 。
(B)确认方Ack=发起方Req+1 , 两端配对 。
二、三次握手
TCP(TransmissionControlProtocol)传输控制协议
TCP是主机对主机层的传输控制协议 , 提供可靠的连接服务 , 采用三次握手确认建立一个连接
位码即tcp标志位,有6种标示:
SYN(synchronous建立联机)
【简简科技:TCP挥手过程及原理,「网络传输」一文搞懂】ACK(acknowledgement确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
Sequencenumber(顺序号码)
Acknowledgenumber(确认号码)
establish建立 , 创建
所谓三次握手(Three-WayHandshake)即建立TCP连接 , 是指建立一个TCP连接时 , 需要客户端和服务端总共发送3个包以确认连接的建立 。 在socket编程中 , 这一过程由客户端执行connect来触发 , 整个流程如下图所示:
(1)第一次握手:Client将标志位SYN置为1 , 随机产生一个值seq=J , 并将该数据包发送给Server , Client进入SYN_SENT状态 , 等待Server确认 。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接 , Server将标志位SYN和ACK都置为1 , ack(number)=J+1 , 随机产生一个值seq=K , 并将该数据包发送给Client以确认连接请求 , Server进入SYN_RCVD状态 。
(3)第三次握手:Client收到确认后 , 检查ack是否为J+1 , ACK是否为1 , 如果正确则将标志位ACK置为1 , ack=K+1 , 并将该数据包发送给Server , Server检查ack是否为K+1 , ACK是否为1 , 如果正确则连接建立成功 , Client和Server进入ESTABLISHED状态 , 完成三次握手 , 随后Client与Server之间可以开始传输数据了 。
SYN攻击:
在三次握手过程中 , Server发送SYN-ACK之后 , 收到Client的ACK之前的TCP连接称为半连接(half-openconnect) , 此时Server处于SYN_RCVD状态 , 当收到ACK后 , Server转入ESTABLISHED状态 。
SYN攻击就是Client在短时间内伪造大量不存在的IP地址 , 并向Server不断地发送SYN包 , Server回复确认包 , 并等待Client的确认 , 由于源地址是不存在的 , 因此 , Server需要不断重发直至超时 , 这些伪造的SYN包将长时间占用未连接队列 , 导致正常的SYN请求因为队列满而被丢弃 , 从而引起网络堵塞甚至系统瘫痪 。
SYN攻击时一种典型的DDOS攻击 , 检测SYN攻击的方式非常简单 , 即当Server上有大量半连接状态且源IP地址是随机的 , 则可以断定遭到SYN攻击了 , 使用如下命令可以让之现行:
#netstat-nap|grepSYN_RECV
三、四次挥手
三次握手耳熟能详 , 四次挥手估计就..所谓四次挥手(Four-WayWavehand)即终止TCP连接 , 就是指断开一个TCP连接时 , 需要客户端和服务端总共发送4个包以确认连接的断开 。 在socket编程中 , 这一过程由客户端或服务端任一方执行close来触发 , 整个流程如下图所示:
由于TCP连接时全双工的 , 因此 , 每个方向都必须要单独进行关闭 , 这一原则是当一方完成数据发送任务后 , 发送一个FIN来终止这一方向的连接 , 收到一个FIN只是意味着这一方向上没有数据流动了 , 即不会再收到数据了 , 但是在这个TCP连接上仍然能够发送数据 , 直到这一方向也发送了FIN 。 首先进行关闭的一方将执行主动关闭 , 而另一方则执行被动关闭 , 上图描述的即是如此 。
(1)第一次挥手:Client发送一个FIN , 用来关闭Client到Server的数据传送 , Client进入FIN_WAIT_1状态 。


推荐阅读