三次握手与四次挥手
1.为什么需要三次握手
- 首先明确一下,两次握手是必须的,为什么呢?第一次握手是client发送连接请求给server,server收到连接请求后知道是可以连接成功的,但是client不知道,因此server需要发送一个反馈信息,这样client收到反馈信息后就知道自己是可以与server连接上的,这就是第二次握手。
- 而第三次握手是为了防止已经失效的链接请求又发送到server.例如client发出去的第一个连接请求由于某些原因在网络节点中滞留了导致延迟,直到连接释放的某个时间点才到达server,这是一个早已失效的报文,但是此时server仍然认为这是client的建立连接请求第一次握手,于是server回应了client,第二次握手。如果只有两次握手,那么到这里,连接就建立了,但是此时client并没有任何数据要发送,而server还在傻傻的等候佳音,造成很大的资源浪费。所以需要第三次握手,只要client再次回应一下,就可以避免这种情况。
2.三次握手详解:
-
第一次握手:
- client:发送报文携带标志位SYN和随机的32位序号
-
第二次握手:
- server:发送报文携带标志位ACK加上确认序号(client发送来的随机序号加一),同时发送一个连接请求,SYN加上另一个随机的32位序号
-
第三次握手:
- client:发送报文携带标志位ACK和确认序号(server发来的随机序号加一)
- client:发送报文携带标志位ACK和确认序号(server发来的随机序号加一)
SYN:请求建立连接的标志位
ACK:应答标志位
FIN:断开连接(挥手的时候用到)
3.四次挥手详解
首先明确,哪一端断开连接都可以
- 第一次挥手
- client:发送断开连接的请求:FIN+序号,这个序号是对方最后一次发送ACK携带的确认序号,以及ACK+序号
- 第二次挥手
- server:发送确认数据包,ACK+序号,这个序号是FIN携带的序号加一
- 第三次挥手
- -server:再次发送断开连接的请求:FIN+序号,ACK+序号
- 第四次挥手
- client:发送确认数据,ACK+序号
在四次挥手中,主动断开连接的一方在TIME_WAIT状态后并不会立即结束进程,而是会等待2MSL时间之后才会结束,一个MSL大概是30s。而另一方在进入LAST_ACK后发出最后一个FIN,如果收到反馈的ACK,则会立即终止进程。
那么为什么主动断开连接的那一方要等待2MSL的时间呢,因为最后一个ACK信号发出后,另一方未必能够收到,如果对方长时间没有收到ACK信号,就会再次发送FIN,如果此时主动断开连接的那一方已经结束进程了就无法保证收到对方第二次发来的FIN信号。也就是保证对方能够结束进程,主动终止的一方在2MSL之后也会结束进程。
- client:发送确认数据,ACK+序号
4.tcp的数据传输过程
mss指的是最大数据长度,()中的数字指的是报文中携带数据的长度
编号是对方最后发送ACK的时候携带的确认序号
5.tcp的状态转换
答:三次握手:
第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
四次挥手:
第一次挥手:主动关闭方发送一个FIN,告诉被动方:我已经不 会再给你发数据,主动方进入FIN_WAIT1状态。
第二次挥手:被动方收到FIN包后,发送一个ACK给对方,被动方进入CLOSE_WAIT状态,主动方收到后进入FIN_WAIT2状态
第三次挥手:被动方发送一个FIN,告诉主动方:我的数据也发送完了,不会再给你发数据了,被动方进入LAST_ACK状态
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,主动方进入TIME_WAIT状态
6.为什么服务端容易受到syn攻击
Server第二次握手进行资源分配, Client第三次握手进行资源分配
Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。
可以降低主机的等待时间使得主机尽快的释放正在链接中的得请求
7.为何什么建立连接时三次握手,断开是四次挥手
建立连接的时候,服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。