connect() api调用发生在三次握手之后
accept() api调用发生在三次握手之后
“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”
因为tcp是全双工模式,接收到FIN时意味将没有数据再发来,但是还是可以继续发送数据,所以断开连接时必须是四次握手
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
socket API 和 TCP 协议中各个状态可以通过下图来看:
connect发送了一个SYN,收到Server的SYN+ACK后,代表连接完成。发送最后一个ACK是protocol stack,tcp_out完成的。它是在三次握手过程中调用的。
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
参考链接:http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520118139252103/