1,三次握手
(我要和你建立链接,你真的要和我建立链接么,我真的要和你建立链接,成功)
这是一个建立连接的过程
- 第一次握手:客户端发送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
连接都将被一直保持下去。
2,四次挥手
(我要和你断开链接;好的,断吧。我也要和你断开链接;好的,断吧):
这是一个断开连接的过程
- 第一次挥手:客户端主动关闭方发送一个FIN,用来关闭客户端到服务端的数据传送,也就是客户端告诉服务端:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,客户端依然会重发这些数据),但是,此时客户端还可以接受数据。
- 第二次挥手:服务端收到FIN包后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
- 第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,也就是告诉客户端,我的数据也发送完了,不会再给你发数据了。
- 第四次挥手:客户端收到FIN后,发送一个ACK给服务端,确认序号为收到序号+1,至此,完成四次挥手。
3,第3次握手失败会怎么办?
第三次失败,只有客户端处于成功状态(因为第2次服务器返回了ACK),服务器端没有接收到客户端的 ACK。这要分几种情况讨论:
1.客户端发出的 ACK 丢失了,发出的 下一个数据包没有丢失,则服务端接收到下一个数据包(这个数据包里也会带上 ACK 信息),能够进入正常的 ESTABLISHED 状态
如果服务端和客户端都没有数据发送,或者服务端想发送数据(但是发不了,因为没有收到客户端的
ACK),服务器都会有定时器发送第二步SYN+ACK数据包,如果客户端再次发送ACK成功,建立连接。
如果一直不成功,服务器肯定会有超时设置,超时之后会给客户端发RTS报文,进入CLOSED状态,防止SYN洪泛攻击。
4,为什么TCP链接需要三次握手,两次不可以么,为什么?
如果两次的话,那么当客户端滞留的链接请求报文又发送到服务器的时候,服务器会误以为客户端要与自己建立链接,就会发送一个确认数据包,但是由于客户端并没有要建立链接的意愿,所以不对服务器发送的数据包做出响应,但是服务器并不知道客户端的情况,就会一直处于等待的状态,如此,就会白白浪费服务端的资源。
5,为什么连接的时候是三次握手,关闭的时候却是四次握手?
TCP是全双工模式,关闭连接时,当主机B收到主机A的FIN报文时,仅仅表示主机 A不再发送数据了但是还能接收数据。此时,主机B也未必全部数据都发送给A了,所以B可以立即close;也可以发送一些数据给A后,再发送FIN报文给对方来表示同意现在关闭连接,因此,主机BACK和FIN一般都会分开发送。
链接:https://baijiahao.baidu.com/s?id=1631856490188327912&wfr=spider&for=pc