TCP connection and disconnection
TCP:
一. 属性:
1. 提供客户端和服务器端的连接;
2. 提供可靠性;
3. 用于动态估算client和server之间的往返时间;
4. 关联***,对发送的数据进行排序;
5. 流量控制,通过告知对端在任何时刻它一次能够从对端接收多少字节的数据(即:通过窗口),在任何时刻窗口支出缓存区中当前可用的空间量,从而确保发送端发送的数据不会使接受缓冲区溢出;
6. 全双工的连接。
二. TCP 连接建立和终止
1. 三路握手(three-way handshake)
(1). server首先必须准备好接受外来的连接。通常通过调用socket、bind、listen这三个函数来完成(即:被动打开 passive open);
(2). client调用connect发起主动连接(active open).通常客户端发送一个SYN,它告诉server客户将在(待建立的)连接中发送数据的初始***,SYN不携带数据,其所在的IP数据报只包含一个IP header、一个TCP header及可能存在的TCP options;
(3). server必须确认(ACK)客户的SYN,同时自己也得发送一个SYN,它包含有服务器在同一连接中发送的数据的初始***。服务器在单个的segement中发送SYN和回应客户端SYN的ACK;
(4). client必须回应(ACK)给server的SYN。
2. 四路分手终止连接
(1). 某个应用进程首先调用close,称之为执行主动关闭(active close),该端的TCP于是发送一个FIN,表示数据发送完毕;
(2). 接收到FIN的对端执行被动关闭(passive close). 这个FIN由TCP确认,它的就收也作为一个文件结束符(end-of-file)传递给接收端应用程序(放在已排队等候该应用进程接收的任何其它数据之后),因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收;
(3). 在一段时间后,接收到这个文件结束符的应用进程将调用close来关闭它的socket。这导致接收端的TCP也发送一个FIN;
(4). 接收到这个最终FIN的原始发送端TCP(即执行主动关闭的那一端)确认这个FIN。
一. 属性:
1. 提供客户端和服务器端的连接;
2. 提供可靠性;
3. 用于动态估算client和server之间的往返时间;
4. 关联***,对发送的数据进行排序;
5. 流量控制,通过告知对端在任何时刻它一次能够从对端接收多少字节的数据(即:通过窗口),在任何时刻窗口支出缓存区中当前可用的空间量,从而确保发送端发送的数据不会使接受缓冲区溢出;
6. 全双工的连接。
二. TCP 连接建立和终止
1. 三路握手(three-way handshake)
(1). server首先必须准备好接受外来的连接。通常通过调用socket、bind、listen这三个函数来完成(即:被动打开 passive open);
(2). client调用connect发起主动连接(active open).通常客户端发送一个SYN,它告诉server客户将在(待建立的)连接中发送数据的初始***,SYN不携带数据,其所在的IP数据报只包含一个IP header、一个TCP header及可能存在的TCP options;
(3). server必须确认(ACK)客户的SYN,同时自己也得发送一个SYN,它包含有服务器在同一连接中发送的数据的初始***。服务器在单个的segement中发送SYN和回应客户端SYN的ACK;
(4). client必须回应(ACK)给server的SYN。
2. 四路分手终止连接
(1). 某个应用进程首先调用close,称之为执行主动关闭(active close),该端的TCP于是发送一个FIN,表示数据发送完毕;
(2). 接收到FIN的对端执行被动关闭(passive close). 这个FIN由TCP确认,它的就收也作为一个文件结束符(end-of-file)传递给接收端应用程序(放在已排队等候该应用进程接收的任何其它数据之后),因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收;
(3). 在一段时间后,接收到这个文件结束符的应用进程将调用close来关闭它的socket。这导致接收端的TCP也发送一个FIN;
(4). 接收到这个最终FIN的原始发送端TCP(即执行主动关闭的那一端)确认这个FIN。
三. TCP 状态转换
2. 分组观察
(1)客户advertise一个值为536的MSS(表名该client只实现了最小重组缓冲区大小),服务器advertise一个值为1460的MSS(以太网上IPv4的典型值):
(2)TIME_WAIT状态
执行主动关闭的那一端会经历time_wait这个状态。该端点停留在这个状态是最长分段生命期(Maximum Segement Lifetime, MSL)的两倍,即2MSL。
存在的两个理由:
a. 可靠地实现TCP全双工连接的终止;(原因是可能不得不重传被丢掉的那个最终ACK)
b. 允许老的重复segement在网络中消逝。
NOTE: TCP 必须防止来自某个连接的老的重复分组在该连接已终止后出现,从而被误解成属于同一个连接的某个新的化身。既然TIME_WAIT状态持续的时间是2MSL,这就足够让某个方向上的分组最多存活MSL秒被丢弃,另一个方向的应答最多存活MSL秒也被丢弃。通过实施这个规则,就可以保证每次成功建立一个TCP连接时,来自连接先前的老的重复分组都已经在网络中消逝了。