一,在我们创建套接字(socket )成功过后,进行绑定ip地址,端口号,然后进行监听,有客户端接入我们会有一个三次握手的过程。
一次握手:客户端会发送一个请求报文SYN,并携带初始的序列号为x,并且需要消耗一个序号,此时客户端进入SYN_SENT状态。
二次握手:服务端收到来自客户端的SYN报文后,对这个SYN报文确认后,会把自己的SYN报文响应给客户端,此时ACK=1表示确认序列号有效,并且确认号(ack)的值为传来的seq+1,即为x+1,此时初始序号为y。此时服务器进入SYN_RECV状态
三次握手:客户端收到了服务器SYN+ACK的包,此时客户端处于ESTABLISHED状态并且客户端和服务端均表示同意连接,,确认号因此会发送一个ACK报文ack的值仍为序列号+1,即y+1,初始seq值为x,所以第二个报文段seq+1,即x+1。
注:前两次不能携带数据,第三次可以携带数据
为什么不能两次握手?
此时你和你的对象拨通了电话:
你 :“喂,能听到我说话吗?”
你对象 :“亲爱的,我可以听到!”
此时你突然不说话了…
如果已经建立了连接,但是突然故障了怎么办?
tcp设有一个保活计时器,显然如果出现故障,服务器不会一直等下去,客户端每发送一个消息,计算器就会被复位,一般计算器设置在2个小时,如果2小时,服务器没有收到任何数据,会发送一个探测报文给客户端,一共发10次,每隔75s发一次,若10个报文发送过去,客户端依旧没有反应,服务器就会认为出现故障,就会关闭服务器 。
二、四次挥手(断开连接)
第一次挥手:客户端打算关闭连接,FIN=1报文给服务端。
第二次挥手:服务端收到以后,向客户端发送ACK应答报文,此时并不是马上就断开,而是告诉客户端我知道你要断开连接了,但是我要把我这边数据处理完成。
第三次挥手:等待服务端处理完数据后,向客户端发送FIN报文。
第四次挥手:客户端接收到FIN报文后回一个ACK应答报文。
服务器收到ACK报文后,进入close状态,服务器完成连接关闭。
为什么连接要3次,断开要4次?
因为第二次挥手并不是马上就断开,而是告诉客户端我知道你要断开连接了,但是我要把我这边数据处理完成在说。