HTTP

一、TCP/IP 协议三次握手与四次挥手流程

1、TCP 报文格式

TCP 报文格式图

TCP/IP 协议的信息

  • (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

  • (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。

  • (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:

    • (A)URG:紧急指针(urgent pointer)有效。
    • (B)ACK:确认序号有效。
    • (C)PSH:接收方应该尽快将这个报文交给应用层。
    • (D)RST:重置连接。
    • (E)SYN:发起一个新连接。
    • (F)FIN:释放一个连接。
  • 注意:

    • (A)不要将确认序号Ack与标志位中的ACK搞混了。
    • (B)确认方Ack=发起方Req+1,两端配对。

2、三次握手过程

TCP(Transmission Control Protocol) 传输控制协议

Sequence number(顺序号码)

Acknowledge number(确认号码)

establish 建立,创建

TCP 是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接位码即 tcp 标志位,有6种标示:

  • SYN(synchronous建立联机)
  • ACK(acknowledgement 确认)
  • PSH(push传送)
  • FIN(finish结束)
  • RST(reset重置)
  • URG(urgent紧急)

所谓 三次握手(Three-Way Handshake) 即建立TCP连接,是指建立一个 TCP 连接时,需要客户端和服务端总共发送 3 个包以确认连接的建立。在socket 编程中,这一过程由客户端执行 connect 来触发,整个流程如下图所示:

三次握手过程,A:客户端;B:服务器

  • 1)第一次握手:客户端发起一个新连接,并将 标志位 SYN 置位1,随机产生一个序号值 seq=x,并将该数据包发送给服务端,客户端进入 SYN_SENT 状态,等待服务端确认。<SYN=1,seq=x>

  • 2)第二次握手:服务器接受请求,收到数据包后由 标志位 SYN 知道客户端请求并建立连接,服务端将 标志位 SYNACK都置为1,ack=x+1,随机产生一个值 seq=y,并将该数据包发送给客户端以确认连接请求,服务端进入 SYN_RCVD 状态。<SYN=1,ACK=1,ack=x+1,seq=y>

  • 3)第三次握手:客户端收到确认后,检查 ack 是否为 x+1,ACK 是否为1,如果正确则将 标志位 ACK 置为1,ack=y+1,并将该数据包发送给服务端,服务端检查 ack 是否为 y+1,ACK 是否为1,如果正确则连接建立成功,客户端和服务器进入 STABLISHED 状态,完成三次握手后,两端开始进行数据传输。<SYN=1,ACK=1,ack=y+1>

SYN 攻击:
在三次握手过程中,Server 发送 SYN-ACK 之后,收到 Client 的 ACK 之前的 TCP 连接称为半连接(half-open connect),此时 Server 处于 SYN_RCVD 状态,当收到 ACK 后,Server 转入 ESTABLISHED 状态。SYN 攻击就是 Client 在短时间内伪造大量不存在的 IP 地址,并向 Server 不断地发送 SYN 包,Server 回复确认包,并等待 Client 的确认,由于源地址是不存在的,因此,Server 需要不断重发直至超时,这些伪造的 SYN 包将长时间占用未连接队列,导致正常的 SYN 请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。 SYN 攻击时一种典型的 DDOS 攻击,检测 SYN 攻击的方式非常简单,即当 Server 上有大量半连接状态且源 IP 地址是随机的,则可以断定遭到 SYN 攻击了,使用如下命令可以让之现行:

#netstat -nap | grep SYN_RECV

3、四次挥手过程

所谓四次挥手👋😆(Four-Way Wavehand)即终止 TCP 连接(断开一个 TCP 连接时,需要客户端和服务端总共发送 4 个包以确认连接的断开)。在 socket 编程中,这一过程由客户端或服务端任一方执行 close 来触发,整个流程如下图所示:

四次挥手过程,A:客户端;B:服务器

由于TCP连接是全双工的,因此每个方向都必须要单独进行关闭,这一原则是:当一方完成数据发送任务后,发送一个 FIN 来终止这一方向的连接,收到一个 FIN 只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个 TCP 连接上仍然能够发送数据,直到这一方向也发送了 FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

  • 1)第一次挥手:客户端发送一个 FIN,用来关闭客户端到服务端的数据传送,客户端进入 FIN_WAIT_1 状态。
  • 2)第二次挥手:服务端收到 FIN 后,发送一个 ACK 给客户端,确认序号为收到序号+1(与 SYN 相同,一个 FIN 占用一个序号),服务端进入 CLOSE_WAIT 状态。
  • 3)第三次挥手:服务端发送一个 FIN ,用来关闭服务端到客户端的数据传送,服务端进入 LAST_ACK 状态。
  • 4)第四次挥手:客户端收到 FIN 后,客户端进入 TIME_WAIT 状态,接着发送一个 ACK 给服务端,确认序号为收到序号+1,服务端进入 CLOSED 状态,完成四次挥手。

4、问题解析

  • 1)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

    解释1、由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向的连接。收到一个 FIN 只意味着这一方向上没有数据流动,一个 TCP 连接在收到一个 FIN 后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

    解释2、这是因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端。而关闭连接时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即 close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方 ACK 和 FIN 一般都会分开发送。

posted on 2018-05-04 17:00  TokeyJerry  阅读(478)  评论(0编辑  收藏  举报