TCP第三次握手携带数据
第一次和第二次是不可以携带数据的,但是第三次是可以携带数据的。
加入第一次握手可以携带数据的话,那对于服务器来说太危险了,如果有人恶意攻击服务器的话,每次都在第一次握手中的SYN报文中放入大量的数据,并且不断的重发SYN报文,服务器就会花费很多时间和内存空间去接收这些报文。
第三次握手,此时客户端已经处于ESTABLISHED状态。对于客户端来说,已经建立了连接,并且已经知道服务器的接收和发送能力是正常的,所以也就可以携带数据了。
服务器不调用accept
即使服务端不调用accept,客户端依然可以连接。
当客户端调用connect时,将触发三次握手过程,客户端首先发送SYN请求分组,此时服务器会将请求放入SYN队列,同时向客户端发送ACK确认报文,然后客户端向服务器再次发送ACK确认报文。服务器收到ACK确认报文后,将SYN队列中的连接请求移入accept队列中。此时三次握手结束,即TCP连接成功建立。然后内核通知用户空间的阻塞的服务进程,服务进程调用accept仅仅是从accept队列里取出一个连接而已。也就是说客户端调用connect连接服务器,与服务器调用accept“接收”连接是两个独立的过程。
但是客户端调用close函数关闭连接后,服务器就会处于CLOSE_WAIT状态,注意最后的CLOSE_WAIT状态会一直存在,直到服务器进程退出。当客户端进程退出后,客户端保留的FIN_WAIT2状态自然释放,但服务器由于未获得connection的文件描述符无发主动调用close函数,因此服务器的CLOSE_WAIT状态会一直持续到服务进程退出。