TCP/IP以及三次握手、四次挥手-Java基础

TCP/IP以及三次握手、四次挥手-Java基础_第1张图片

 

TCP三次握手,客户端执行connect来触发

  1. Client将标志位SYN置1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待服务器确认。
  2. 第二次,服务器收到SYN包,确认用户的SYN,并发送一个SYN包,即SYN+ACK包,此时服务器进入SYN-RECV状态。
  3. 客户端收到服务器的SYN-ACV包,瞎忙活服务器发送确认报文ACK,此包发送完毕,客户端和服务器端进入established状态,完成三次握手,服务器和客户端开始传输数据
  4. SYN攻击:服务器端收到客户端的ACK之前的TCP连接称为半连接,服务器处于SYN-RCVD状态,收到ACK智慧转变为established状态。SYN攻击就是客户端在短时间伪造大量步存在的IP地址,不断向服务器端发送,服务器发送确认报,等待客户端确认,这个源地址却步存在。服务器重复发送,直至超时,引起网络阻塞甚至系统瘫痪。典型的DDOS攻击,当服务器上有大量半连接状态且IP地址随机,则任务是SYN攻击。

 四次挥手-终止TCP连接,由客户端或服务器端任意一方执行close来触发。

  1. 第一次,客户端发送一个FIN,用来关闭客户端到服务器端数据传输,客户端进入FIN-wait-1状态。
  2. 第二次,服务器端收到FIN后,发送一个ACK给客户端,确认序号为手段的序号+1,服务器端进入close-wait状态;
  3. 第三次,服务器端发送一个FIN,关闭服务器端到客户端的数据传输,服务器端进入last_ACK状态。
  4. 第四次,客户端收到FIN后,客户端进入time_wait状态,接着发送一个ACK给server,确定序列为收到序列+1.客户端进入closed状态,完成四次挥手。

建立TCP需要三次握手,关闭为什么需要四次挥手?

因为服务器端在listen状态下,收到连接请求,把ACK和SYN一起发送给客户端。而关闭的时候,对方收到FIN仅仅代表对方不再发送数据,但是还能接收数据,乙方未必把所有数据都进行的传输,乙方可以立即close也可以再进行发送,再发送FIN代表同意关闭连接,乙方的ACK和FIN是分开发送的。

Time_wait需要经过2msl最大报文段生存时间才能返回close:保证可靠性关闭;保证连接的重复字段从网络中消失;

为什么握手需要三次握手,而不是两次或者四次

TCP是建立科考试传输,也就是发送方和接收方始终需要进行同步SYN序号。序号不是0开始而是发送方随机选出一个初始序列化ISN开始,TCP是一个双向通信协议,通信双方都有能力发送信息,并接收响应。因此双方都响应随机产生一个初始化序列化,并且把这个值告诉对方,得到确认。

如果只有两次可能会发送死锁;

TCP/IP以及三次握手、四次挥手-Java基础_第2张图片

为什么不是四次握手

握手是序列化确认的过程,客户端生成的随机的序列号发送给服务器端,服务器端完全可以将自己生成的随机序列化和对方序列化+1的确认号,同时发送给客户端,客户端再返回给服务器端确认号,已经完成了确认。如果将中间步骤分为两次,会造成资源的浪费。

如果建立了连接,但是客户端突然出现故障怎么办

TCP设有一个保活计数器,客户端如果出现故障,服务器不能一直等下去,会造成资源浪费。所以服务器每收到一次客户端的请求后都会重新复位这个计数器,时间通常设置为2个小时,还没有收到客户端数据,服务器就会发送一个探测报文段,以每个75秒的发送一次。若连续发送10个报文还没有翻译,服务器就认为客户端出现挂账,接着就关闭连接。

 

扫码关注一起随时随地学习!!!就在洋葱攻城狮,更多精彩,等你来!!

你可能感兴趣的:(java)