TCP/IP 三次握手

TCP(Transmission Control Protocol)是面向连接的通信协议,通过三次握手建立连接, 然后才能开始数据的读写,通讯完成时要拆除连接,由于 TCP 是面向连接的所以只能用于端 到端的通讯。

其提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间 的准备工作。

所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认 连接的建立。在 socket 编程中,这一过程由客户端执行 connect 来触发。

TCP三次握手过程图:(面试点

TCP标志位,有6种标识:

①  SYN(synchronous建立联机)    ②  ACK(acknowledgement 确认)    ③  PSH(push传送)    ④  FIN(finish结束)

⑤  RST(reset重置)    ⑥  URG(urgent紧急)    Sequence number(顺序号码 seq) / Acknowledge number(确认号码 ack)

1. 第一次:客户端将标志位 SYN 置为 1,随机产生一个值 seq=x,并将该数据包发送
给服务器端,客户端进入 SYN_SENT 状态,等待服务器端确认。

2. 第二次:服务器端收到数据包后由标志位 SYN=1 知道客户端请求建立连接,服务

器端将标志位 SYN 和 ACK 都置为 1,ack=x+1,随机产生一个值 seq=y,并将该数据包发送给客户端以确认连接请求,服务器端进入 SYN_RCVD 状态。

3. 第三次:客户端收到确认后,检查 ack 是否为 x+1,ACK 是否为 1,如果正确则将

标志位 ACK 置为 1,ack=y+1,并将该数据包发送给服务器端。服务器端检查 ack 是否为 y+1,ACK 是否为 1,如果正确则连接建立成功,客户端和服务器端进入 ESTABLISHED 状态。完成三次握手后客户端与服务器端之间可以开始传输数据了。

 

面试问题拓展:

1. 为什么非要是三次握手?不能是两次or四次?

答:TCP 是可靠的传输控制协议,而三次握手是保证数据可靠传输又能提高传输效率的最小次数。

三次握手的过程即是通信双方相互告知***起始值,并确认对方已经收到了*** 起始值的必经步骤。

如果只是两次握手, 至多只有连接发起方的起始***能被确认, 另一方选择的****则得不到确认。 至于为什么不是四次,很明显,三次握手后,通信的双方都已经知道了对方***起始值,也确认了对方知道自己***起始值,第四次握手已经毫无必要了。

2. 三次握手的有没有漏洞?

答:SYN洪泛攻击:三次握手中有一个第二次握手,服务端向客户端应答请求, 应答请求是需要客户端 IP 的,攻击者就伪造这个 IP,往服务器端狂发送第一次握手的内容, 当然第一次握手中的客户端 IP 地址是伪造的,从而服务端忙于进行第二次握手但是第二次 握手当然没有结果,所以导致服务器端被拖累,死机。

解决方案:

A. 无效连接监视释放

这种方法不停监视所有的连接,包括三次握手的,还有握手一次的,反正是 所有的,当达到一定(与)阈值时拆除这些连接,从而释放系统资源。这种方法对 于所有的连接一视同仁,不管是正常的还是攻击的,所以这种方式不推荐。

B. 延缓 TCB 分配方法

一般的做完第一次握手之后,服务器就需要为该请求分配一个 TCB(连接控制资源),通常这个资源需要 200 多个字节。延迟 TCB 的分配,当正常连接建立起来后再分配 TCB 则可以有效地减轻服务器资源的消耗。

C. 使用防火墙(最有效)

防火墙在确认了连接的有效性后,才向内部的服务器(Listener)发起 SYN 请求。