链接建立TCP的三次握手
第1步:从客户端开始发送 SYN (同步)字节,告诉服务器客户在(待建立的)连接中初始序列编号(i),向服务器请求建立连接
第2步:服务器做一些准备工作,并发送给客户端自己的序列编号SYN,并且对第1步做出应答 ACK i +1 ,告诉客户端已经准备好建立连接
第3步:客户端接收到 服务器 发来的 SYN J ,和 ACK i+ 1后,知道服务器已经准备好 ,发送 ACK J +1 建立连接
上述过程与socket代码有何联系?
客户端发起TCP连接的过程是:
client服务器处理TCP逻辑一般是:
server在客户端, tcp 的 三次握手过程 都在 connect 函数中完成 。 在服务端,握手的过程在 accept 函数中. 还可知道 accept 和 connect 函数都是阻塞当前线程的. 那么是什么时候解除阻塞呢? 答案就在三次握手的过程中.
合并由此可知 client 和 server 都是在接收到自己期望的ACK之后,才解除对当前线程的阻塞 ,保证了连接建立的可靠, 第一次的 ack 由SYN i 触发,第二次的 ACK 由 SYN j触发,这也是 TCP 握手是三次的原因.
image.pngTCP的四次挥手(直接与socket 结合)
普通情况:
-
客户端 首先调用 close , 是主动方, 向服务器 发送 FIN 分节,表示此时客户端 已经没有数据要发送, client 此时进入等待状态 FIN_WAIT_1
-
服务端 接收 到 FIN , 向 客户端 发送 ACK ,并进入 CLOSE_WAIT 状态
-
在 CLOSE_WAIT 状态下的 服务端 ,将没有发送完的数据传送给 客户端 , 发送 FIN 表示服务端数据已经发送完成. 客户端 在接收到 FIN 后 回送 ACK 释放资源,客户端 关闭了TCP 连接
-
服务端 接收到 ACK 之后 释放资源, 服务端关闭连接
由于 客户端 在close 方法后,并不能保证此时服务端 的数据都发送完毕, 所以多了一步 服务端 通知 客户端 数据发送完毕的过程, 导致了关闭连接要"四次挥手".
网友评论