TCP协议的三次握手和四次释放详解

来源:互联网 发布:java进阶书籍推荐知乎 编辑:程序博客网 时间:2024/06/05 12:44

(一)TCP协议的三次握手建立连接:

首先客户端动态获取一个动态端口(范围在49151 ~ 65535之间),客户端会通过这个端口主动的打开这次请求;服务器如果规定好向外界提供某种服务,那么这个服务就会对应某个端口,并且这个端口会一直处于监听状态(listener),用来监听并接收客户端的请求并处理(比如:Web服务所对应的80端口);




(1)第一次:客户端获取目标端的IP地址和端口号时,就会发送一个SYN(Synchronize) 的同步请求,告诉服务器我要请求你某种资源,并且希望我们之间的数据能够同步,随机产生一个序列号SEQ = x (Sequence),发送给服务器端;

(2)第二次:服务器端接收到客户端的这次请求,要做出确认应答,就要相应发送一个SYN + ACK(我也给你发送一个同步消息,请客户端确认),随机产生一个 SEQ = y 的序列号,发送一个 ACK = x + 1(表明:我接受到了本次请求,并且我希望你下次发送报文段时,使用序列号 x + 1),服务器端也要告诉客户端我的窗口值(我一次性所发送和接收);

(3)第三次:客户端确认ESTIBLISHED,建立连接,给其服务器发送确认信息,并以序列号SEQ = x + 1发送,ACK = y + 1(表明:我接受到服务器端的数据传输,并且我希望你你下次传输报文段时使用序列号 y +1),并且告诉服务器端我的窗口值(我一次性能发送和接收总字节数的最大容量)。

这就是三次握手的概念,第三次报文段发送完毕,客户端和服务器端进入ESTABLISHED(连接成功)状态,完成三次握手,客户端可以向服务器端开始发送数据了!

(二)TCP协议的四次释放(挥手)断开连接:



(1)第一次:客户端发送完数据了,给其服务器发送信息,释放连接。就会自动将其 FIN = 1,表示客户端通知服务器,我访问完毕,要开始断开连接了,并且随机产生一个序列号SEQ = x

(2)第二次:服务器端向客户端发送没有发送完的报文段。服务器也要对这次连接做出确认,发送 ACK 信息,表示对你这次释放连接的信息做出确认,随机产生一个序列号

SEQ = y,发送ACK = x+ 1(表明:我接收到断开连接的消息,如果你还传报文段就以这个序列号发送)。此时此刻,主机 A 到主机 B 的连接就释放了,连接处于半连接状态,相当于 A 向 B 说:“我已经没有数据要发送了,但如果你还要发送数据,我仍然可以接收!”;

(3)第三次:真正的服务器端与客户端断开连接,任务完成,报文段发送完毕。服务器发送完没有之前发送完的报文段信息以后,再次向客户端发送报文段信息,FIN = 1表示数据报发送完毕,可以结束之间的连接了,ACK 还是第一次客户端向服务器端发送释放连接的请求信息,SEQ = y(和第二次的序列号相同),并且 ACK = x +1(表明:之间你发偶数那个的信息我确认接收到了,你还想发送报文段时,就以这个序列号);

(4)第四次:客户端接收到 FIN = 1的信息,就说明连接可以断开,任务传输终于完成。给其服务端一个确认,SEQ = x +1,并且 ACK = y +1发送给其服务器端。

整个四次释放结束,主机A 和主机B就没有关系了,完全断开连接。(实际生活中也就是关闭浏览器)

注意:以上描述的TCP协议报文段中出现随机序列号,并且每次传输的过程当中在客户端和服务器端不同(客户端使用 x,服务器端使用 y ),主要就是用来将客户端和服务器端报文段的区别开来,方便组装成字节流,通过端口传送给应用层对应的应用进程进行处理。

阅读全文
0 0
原创粉丝点击