3次握手
1). server通过调用listen函数来准备好接受外来连接,称为被动打开(passive open)。
2). client通过connect进行主动打开(active open)。这引起client发送一个SYN(表示同步)分节,它告诉服务器客户将在(带建立的)连接中发送的数据的初始序列号。
3). server必须确认客户的SYN(发送ACK),同时发送一个自己的SYN,它含有server将在同一连接中发送的数据的初始序列号。server在同一个分节中发送SYN和ACK。
4). 客户必须确认server的SYN(ack K+1)。
4次挥手
终止一个连接需要四个分节。
1). 某个应用首先调用close指向主动关闭(active close)。这端TCP于是发送一个FIN分节,表示数据发送完毕。
2). 接收到FIN的另一端被动关闭(passive close)。这个FIN由TCP确认。它的接收也作为文件结束符传递给接收端应用进程(放在已排队等待接收的任何其它数据之后),
因为FIN的接收意味着应用进程在相应连接上再也接收不到额外数据。
3). 一段时间后,接收到文件结束符的进程将调用close关闭它的套接口。这导致它的TCP也发送一个FIN。
4). 接收到这个FIN的原发送端TCP(即主动关闭的那一端)对它进行确认。
5). 每个FIN的ACK的确认号是这个FIN的序列号加1。
注:
1). 在2~3之间可以有从被动端到主动端的数据流。
2). 套接口在关闭时,TCP都发送一个FIN。这种情况在调用close时会发生,然而在进程终止时,所有打开的套接字将自愿
(调用exit或从main返回)或不自愿(进程收到终止信号)地关闭,此时任然打开的TCP连接上也会发出一个FIN。
3). 通常情况是客户端主动关闭,但某些协议如HTTP则是server主动关闭。