socket的TCP的三次握手&&四次挥手

最近要写一个手机demo,功能主要用到了socket套接字:

当手机与娃娃机成功连接时,娃娃机根据手机发送的tcp信息,进行前后左右位移,并抓去娃娃。

所以,转载,整理一篇文章,强化对socket的认识.


在这里要注意:相对于socket来说,一般是client客户端先主动发送请求connect,服务器端server被动接受请求,所以一般是

客户端发送connect连接请求之后,先send发送消息,后recive接收消息;服务端accept接受连接请求,先recive接收消息,然后send发送消息,这个流程必须是一一对应的,不然会出错.

另外,在recive接收消息的时候,不管是服务端,还客户端,都可能出现,buffer无法一次性取出这次recive的所有数据(场景一般是大型文件的下载,例如使用迅雷下载岛国猥琐动作片,你给buffer设置的data数组大小是1024字节,但可能服务器那头,这次给你传了3072字节,导致调用一次receive无法读出这3072字节的数据,只能出去前1024字节数据),此时,可以多次调用reci(int,int,int,int)方法(c里边方法名是这样的)来读取这3072字节以后,再去进行send流程...重要的是recive和send流程必须是以一一对应的,好了,废话不多说了.


socket中的TCP_IP的三次握手与四次挥手:



(一)socket中TCP的三次握手建立连接:


(1)tcp建立连接要进行“三次握手”,即交换三个分组。大致流程如下:


客户端向服务器发送一个SYN J
服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
客户端再想服务器发一个确认ACK K+1
只有就完了三次握手,但是这个三次握手发生在socket的那几个函数中呢?请看下图:


(2)示意图:


(3)步骤:
1.当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;
2.服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;
3.客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。


(4)总结:
客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。
--------------
(二)socket中TCP的四次挥手释放连接:


(1)示意图:


(2)过程:
1.某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
2.另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外数据;
3.一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;

4.接收到这个FIN的源发送端TCP对它进行确认。




【注意】中断连接端可以是Client端,也可以是Server端。

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!