Network——TCP/IP协议三次握手四次挥手
我们都知道,TCP/IP协议是面向连接的协议,即客户端与服务器建立连接之后,在连接断开之前都可相互传送数据。
所谓三次握手与四次挥手,是客户端与服务器之间建立连接的过程。
我们先来看一下TCP报文的格式。
- Seq序号:即图中的32位序号,标识发送方 向 接收方发送的字符流
- Ack序号:即图中的32位确认序号,只有当ACK=1时,序号才有效
- SYN:发起一个连接
- ACK:确认序号有效
- FIN:释放一个连接
三次握手
- 客户端向服务器发送一个随机seq = x,置SYN = 1,表明希望建立连接
- 服务器向客户端发送对seq序列的确认序列ack = x + 1,并置ACK = 1表示确认序列有效;为测试客户端是否真的想建立连接,服务器也发送一个seq = y给它,并置SYN = 1,表明可以建立连接
- 客户端向服务器发送seq序列seq = x + 1,并对服务器发来的seq序列予以确认ack = y + 1,置ACK = 1表明ack序列有效
为什么是三次握手?不是两次?
如果是两次握手的话,很显然需要将第三次的报文传送去掉。
现在假设这么一个情况:
客户端先向服务器发送了一个请求连接的报文,seq = x,但这个报文没有达到服务端,在某处滞留。
客户端过了等待时间后,认为服务器没有接受到报文,因此重新发了一个请求连接报文,seq = y,这次服务器接收到并成功建立连接。
当这次连接释放之后,服务器接收到了第一个请求连接报文并发送连接报文给客户端,又建立了一次连接,然而这次连接本不应该建立。
四次挥手
- 客户端向服务器发送报文,报文中seq = u,FIN = 1表明希望释放链接
- 服务器向客户端发送报文,报文中seq = v,ack = u + 1,ACK = 1
- 接下来,服务器向客户端发送需要发送的数据
- 数据发送结束后,服务器向客户端发送报文,报文中,seq = w,ack = u + 1,ACK = 1,FIN = 1
- 客户端向服务器发送报文,报文中seq = u + 1,ack = w + 1,ACK = 1
为什么是四次挥手?不是三次?
因为客户端希望释放连接时,只是客户端没有数据再传送给服务器,而服务器可能还会有数据要传送给客户端。