图3 TCP的状态变迁图
如果一方已经关闭或异常终止连接而另一方却还不知道,这样的TCP连接成为半打开(Half-Open)的。任何一端的主机异常都可能导致这种情况的发生。只要不打算在半打开连接上传输数据,仍处于连接状态的一方就不会检测另一方已经出现异常。
发生半打开连接的另一个常见原因是,当客户主机突然掉电而不是正常的结束客户应用程序后在关机。
TCP连接在同时打开的情况下,仅建立 一条连接而不是两条连接。图4显示了同时打开期间报文段的交换。两端几乎在同时发送SYN,并进入SYN_SENT状态。当每一端收到SYN时,状态为SYN_RCVD,同时它们都再发送SYN并对收到的SYN进行确认。当双方都收到SYN及相应的ACK时,状态都边前卫ESTABLISHED。因此,一个同时打开的连接需要交换4个报文段。
图4 同时打开期间报文段的交换
同时关闭:当应用层发送关闭命令时,两端均从ESTABLISHED变为FIN_WAIT_1。这将导致双方各发送一个FIN,两个FIN经过网络传送后分别到达另一端。收到FIN后,状态由FIN_WAIT_1变迁到CLOSING,并发送最后的ACK。当收到最后的ACK时,状态变化为TIME_WAIT。图5总结了这些变化。
图5 同时关闭期间的报文段交换
图6显示了当前TCP选项的格式,这些选项的定义来自于RFC 793和RFC 1323。每个选项的开始是1字节kind字段,说明选项的类型。