TCP连接的建立与终止,三次握手和四次握手,以及在socket系列函数中的体现

以前觉得了解这些底层东西并没有什么实质性的用户,但是很多面试都会问到相关的。也不知道为什么。

直到在工作中遇到了一些问题,涉及到了这些底层的知识。

现在重新整理一下,以备后面需要时查询。


我们知道,在tcp的c/s模型中,需要有一个server来监听一个端口,然后client去连接这个端口。

这在编程上面的体现就是:


server首先调用socket创建一个套接字,

然后调用bind函数去绑定一个端口,

然后调用listen去监听(listen会设置一个等待连接队列的最大连接个数,当等待的用户超过这个个数时,会直接拒绝)。

最后调用accept去接收连接的用户,accept会返回一个资源描述符。


client方也是首先调用socket创建一个套接字,

然后connect去连接服务器。


三次握手就是在client调用connect时发生的。客户端调用connect会首先发送一个SYN分节,它会告诉服务器客户将在连接中发送的数据的初始序列号(关于这个序列号,详情请查找tcp协议的一些详细内容)。服务端收到这个SYN时,会返回一个ASK,同时发送一个自己的SYN,客户端收到服务端的SYN时,在发送一个ASK。如下图所示:




这就是经典的三次握手 。因为总共发送了三次数据,所以说三次握手。

SYN和ASK是tcp协议的两个标志位。下图:tcp协议包头。



tcp用三个连节创建一个连接,终结一个连接则需要四个分节。

首先我们称主动调用close函数的一方为主动关闭端,另一方为被动关闭端。

主动关闭端发送一个FIN分节,被动关闭端收到这个分节,发送一个ASK应答。

一段时间后,被动关闭方接受到文件结束符的应用程序也会调用close来关闭这个套接字,同时也会发送一个FIN分节。

主动关闭方接受到FIN时,会发送一个ASK应答。


中间涉及四个分节,所以也叫四次握手。如下图:



上述的是主动断开连接的情况,如果不主动断开连接,那么连接是一直保留着的。即使没有任何数据交换。所以tcp服务端都会有一个心跳掉线机制。具体实现是在程序上层实现的。服务端检查到多久客户端没有发送数据包或者心跳包,就主动断开连接。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章