TCP三次握手
TCP协议提供可靠的连接服务,采用三次握手建立一个连接。以下步骤概述了通常情况下客户端计算机请求与服务器计算机简历TCP的过程:
TCP三次握手图解
- 1. 客户端向服务器发送一个SYN置位的TCP报文,其中包含连接的初始序列号x和一个窗口大小(表示客户端上用来存储从服务器发送来的传入段的缓冲区的大小)。
- 2. 服务器收到客户端发送过来的SYN报文后,向客户端发送一个SYN和ACK都置位的TCP报文,其中包含它选择的初始序列号y、对客户端的序列号的确认x+1和一个窗口大小(表示服务器上用来存储从客户端发送来的传入段的缓冲区的大小)。
- 3. 客户端接收到服务器端返回的SYN+ACK报文后,向服务器端返回一个确认号y+1ACK报文,一个标准的TCP连接完成。
TCP关闭连接,四次握手图解
- 几点注意事项:
- 默认情况下,当调用close( or closesocket)时,如果发送缓冲中还有数据,TCP会继续把数据发送完。
- 发送了FIN只是表示这端不能继续发送数据(应用层不能再调用send发送),但是还可以接收数据。
- 被动关闭端可能会将ACK和FIN合到一起发送,所以这也算不上严格的四次握手—四个报文段。
- 应用层如何知道对端关闭?通常,在最简单的阻塞模型中,当你调用recv时,如果返回0,则表示对端
关闭。在这个时候通常的做法就是也调用close,那么TCP层就发送FIN,继续完成四次握手。 - 关闭TCP连接的最后微妙之处在于对Time-Wait状态的需要。TCP规范要求在终止连接时,两端的关闭握手都完成后,至少要有一个套接字在 Time-Wait状态保持一段时间。这个要求的提出是由于消息在网络中传输时可能延迟。如果在连接两端都完成了关闭握手后,它们都移除了其底层数据结 构,而此时在同样一对套接字地址之间又立即建立了新的连接,那么前一个连接在网络上传输时延迟的消息就可能在新连接建立后到达。由于其包含了相同的源地址 和目的地址,旧消息就会被错误地认为是属于新连接的,其包含的数据就可能被错误地分配到应用程序中。
网络转载请注明:转载自程序员面试之家
并注明本文链接地址: TCP三次握手