为帮助自己了解connect,accept和close这三个函数,就必须了解TCP连接如何建立和终止,并掌握TCP的状态转换图!
三路握手
建立一个TCP连接时会发生下述情形。
(1)首先server需要做随时接受来自cli的连接,这就需要用到socket,bind和listen函数,做出一个被动打开的状态。
(2)此时cli会通过connect函数发起主动打开,cli会发送一个SYN,告诉服务器这是将在连接中发送的数据的初始序列号。
(3)server必须确认(ACK)客户的SYN,同时自己也需要发送一个SYN,它含有服务器在同一连接中发送的数据的初始序列号。服务器在单个分节中发送SYN和对cli的SYN的ACK(确认)。
(4)客户必须确认服务器的SYN。

此过程中至少需要三个分节,所以被叫做三次握手。
TCP连接终止
TCP建立连接需要3个分节,终止一个连接则需要4个分节。
(1)应用进程先调用close,执行主动关闭,此端会发送一个FIN分节,便是数据发送完毕。
(2)接收到FIN的对端执行被动关闭,这个FIN放在已排队等候该应用进程接受的任何其他数据之后,FIN意味着不会再去接受任何额外数据。
(3)一段时间后,接受这个FIN的应用进程将调用close关闭他的套接字。
(4)最终执行主动关闭的那一端会确认被动关闭端的发送来的FIN。

TCP状态转换图

浙公网安备 33010602011771号