TCP的三路握手和四路挥手

来源:互联网 发布:服务器崩溃数据丢失 编辑:程序博客网 时间:2024/06/04 19:08


TCP(Transmission Control Protocol,传输控制协议)是常用的传输层协议,与另外一种传输层协议UDP(User Datagram Protocol,用户数据传输协议)无需连理C/S链接不同,TCP协议时基于链接。

那么这个连接的建立和断开机制是什么样的呢?

一,三次握手

1,server必须首先准备好接收外来的链接,要做哪些准备呢?即建立一个套接字,将套接字绑定到一个IP和端口上,然后监听,这个过程常被称作被动打开(passive open)。亦即网络编程中的socket、bind、listen这三个API做的事情,这是准备工作。

2,client主动连接server(即active open),client发送一个SYN(同步)分节,目的是让server知道client在将要建立的TCP连接中发送的数据的初始序列号,通常SYN分节只包含一个IP首部,一个TCP首部,以及一些TCP选项(MSS、窗口规模、时间戳),并不携带数据。即由client发起的connect调用。

3,server必须确认(ACK)client的SYN,确认的方式是发送给client一个client端发送给server的初始序列号加1的序列号,同时自己也给client发送一个SYN,这个SYN包含server在将要建立的TCP连接中发送数据的初始序列号。

4,client在收到server的初始化序列号之后同样需要确认,方式同3,将收到的server端初始化序列号加一返回。

可以看到,上面的2,3,4步,有三次数据交换,即为TCP的三次握手,更确切的说是三路握手(three-way handshake)。

具体可见下图:



二,四次挥手

1,server或者client进程close了socket,即执行了主动关闭(active close),该端发送一个FIN分节,表示数据发送完毕。

2,相对而言,接收到这个FIN的对端就执行被动关闭(passive close),先回给主动关闭端一个这个FIN的ACK(FIN的序列号加一),然后将这个FIN作为EOF,放在已经排队等待该端接收的任何其他数据之后(避免丢帧),同时理解为对端不会再跟自己有数据交换。

3,在对端从队列中接收到这个FIN之后,将本端socket也close掉,同时发出一个FIN。

4,接收到步骤3中的发出FIN的主动关闭端,同样需要ACK这个FIN,方式也是FIN的序列号加一返回给被动关闭端。

具体可见下图:




0 0