TCP连接的建立和终止

三路握手
建立一个TCP连接时会发生下述情形
(1)服务器必须准备好接受外来的连接。通常通过socket、bind和listen这三个函数来完成,我们称之为被动打开
(2)客户通过调用connect发起主动打开。这导致客户TCP发送一个SYN分节,它告诉服务器客户将在(待建立的)连接中发送的数据的初始序列号,通常SYN分节不携带数据,其所在IP数据报只含有一个IP首部、一个TCP首部及可能有的TCP选项
(3)服务器必须确认ACK客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器在单个分节中发送的SYN和对客户SYN的ACK确认
(4)客户必须确认服务器的SYN
这种交换至少需要3个分组,因此称之为TCP三次握手
TCP选项
每一个SYN可以含有多个TCP选项,下面时常用的TCP选项

MSS选项。
发送SYN的TCP一端使用本选项通告对端它的最大分节大小即MSS,也就是他在本连接的每个TCP分节中愿意接受的最大数据量。发送端TCP使用接收端的MSS值作为所发送分节的最大大小。TCP_MAXSEG套接字选项提取和设置这个TCP选项。

窗口规模选项。
TCP连接任何一端能够通告对端最大窗口大小是65535,因为在TCP首部相应的字段占16位,然而当今因特网已普及高速网络连接或长延迟路径要求有更大的窗口以获得尽可能大的吞吐量。这个选项指定TCP首部中的通告窗口必须扩大的位数,因此所提供的最大窗口接近1GB。在一个TCP连接上使用窗口规模的前提时它的两个端系统必须都支持这个选项。SO_RCVBUF套接字选项影响这个TCP选项。

时间戳选项。
这个选项对于高速网络连接是必要的,它可以防止由失而复现的分组可能造成的数据损坏。它是一个交心的选项,也以类似于窗口规模的选项方式协商处理。

TCP连接终止
TCP建立一个连接需要3个分节,终止需要四个分节
(1)某个应用进程首先调用close,我们称该端执行主动关闭。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
(2)接收到这个FIN的对端执行被动关闭。这个FIN由TCP确认。它的接收也作为一个文件结束符传递给接收端应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为FIN接收意味着接收端应用进程在相应的连接上再无额外数据可接收。
(3)一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN
(4)接收到这个最终的FIN的原发送端TCP(即执行主动关闭的一端)确认这个FIN。
既然每个方向需要一个FIN和一个ACK,因此通常需要4个分节。我们使用限定词“通常”是因为:某些情形下步骤1的FIN随数据一起发送;另外步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。
类似SYN,一个FIN也占据1个字节的序列号空间。因此,每个FIN的ACK确认号就是这个FIN序列号加1
在步骤2和步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据时可能的。这称为半关闭。
当套接字被关闭时,其所在端TCP各自发送一个FIN。我们在图中指出,这是由应用程序调用close而发生的,不过需认识到,当一个UNIX进程无论自愿的还是非自愿的收到一个终止本进程的信号终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN
无论时服务器一端 还是客户都可以主动关闭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值