TCP-IP详解卷1-18:TCP连接的建立与终止
一:状态迁移
1: 客户端TCP状态迁移:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
2: 服务器TCP状态迁移:CLOSED->LISTEN->SYN_RECV->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
3: 连接序列状态:LISTEN,SYN-SENT,SYN-RECEIVED,ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT和CLOSED。
A: LISTEN侦听来自远方TCP端口的连接请求;
B: SYN-SENT在发送连接请求后等待匹配的连接请求;
C: SYN-RECEIVED在收到和发送一个连接请求后等待对连接请求的确认;
D: ESTABLISHED代表一个打开的连接,数据可以传送给用户;
E: FIN-WAIT-1等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
F: FIN-WAIT-2从远程TCP等待连接中断请求;
G: CLOSE-WAIT等待从本地用户发来的连接中断请求;
H: CLOSING等待远程TCP对连接中断的确认;
I: LAST-ACK等待原来发向远程TCP的连接中断请求的确认;
J: TIME-WAIT等待足够的时间以确保远程TCP接收到连接中断请求的确认;
K: CLOSED没有任何连接状态;
二:三次握手
1: 发SYN包,然后返回SYN/ACK包,再发ACK包,连接正式建立。
但是这里有点出入,当请求者收到SYS /ACK包后,就开始建立连接了,而被请求者第三次握手结束后才建立连接。
2: 当客户端开始连接时,服务器还处于LISTENING,
客户端发一个SYN包后,他就处于SYN_SENT状态,服务器就处于SYS_RECV状态,
然后互相确认进入连接状态ESTABLISHED.
三:四次握手
1: 发FIN包,ACK 包,FIN包,ACK包,四次握手。
因为TCP连接是全双工,我关了你的连接,并不等于你关了我的连接。
关闭连接时,当收到对方的FIN报文 通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文 和FIN报文多数情况下都是分开发送的。
2: 当客户端请求关闭连接时,客户端发送一个FIN包后,客户端就进入FIN_WAIT_1状态,等待对方的确认包,
服务器发送一个ACK包给客户,客户端收到ACK包后结束FIN_WAIT_1状态,进入FIN_WAIT_2状态,等待服务器发过来的关闭请求,
服务器发一个FIN包后,进入CLOSE_WAIT状态,
当客户端收到服务器的FIN包,FIN_WAIT_2状态就结束,然后给服务器端的FIN包给以一个确认包,客户端这时进入TIME_WAIT,
当服务器收到确认包后,CLOSE_WAIT状态结束了,
这时候服务器端真正的关闭了连接.但是客户端还在TIME_WAIT状态下,
3: TIME_WAIT状态的原因
原因是有足够的时间让ACK包到达服务器端,如果服务器端没收到ACK包,超时了,然后重新发一个FIN包,直到服务器收到ACK 包.
四:TCP最大报文长度
1: 最大报文段长度(MSS)表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。
2: 在有些书中,将它看作可“协商”选项。它并不是任何条件下都可协商。当建立一个连接时,每一方都有用于通告它期望接收的MSS选项(MSS选项只能出现在SYN报文段中)。
如果一方不接收来自另一方的MSS值,则MSS就定为默认值536字节(这个默认值允许20字节的IP首部和20字节的TCP首部以适合576字节I P数据报)。
3: 如果没有分段发生, MSS还是越大越好。报文段越大允许每个报文段传送的数据就越多,相对IP和TCP首部有更高的网络利用率。
3: 当TCP发送一个SY 时,或者是因为一个本地应用进程想发起一个连接,或者是因为另一端的主机收到了一个连接请求,它能将MSS值设置为外出接口上的MTU长度减去固定的IP首部和TCP首部长度。对于一个以太网, MSS值可达1460字节。
4: 如果目的IP地址为“非本地的(nonlocal )”,MSS通常的默认值为536。而区分地址是本地还是非本地是简单的,如果目的IP地址的网络号与子网号都和我们的相同,则是本地的;如果目的IP地址的网络号与我们的完全不同,则是非本地的;
5: MSS让主机限制另一端发送数据报的长度。加上主机也能控制它发送数据报的长度,这将使以较小MTU连接到一个网络上的主机避免分段。
五:复位报文段
1: 如果TCP收到的一个报文明显不是属于该主机上的任何个连接,则向远端发送一个复位报文。
2: 到不存在的端口的连接请求
产生复位的一种常见情况是当连接请求到达时,目的端口没有进程正在听。对于UDP,当一个数据报到达目的端口时,该端口没在使用,它将产生一个ICMP端口不可达的信息。而TCP则使用复位。
3: 异常终止一个连接
终止一个连接的正常方式是一方发送FIN。有时这也称为有序释放(orderly release),因为在所有排队数据都已发送之后才发送FIN,正常情况下没有任何数据丢失。但也有可能发送一个复位报文段而不是FIN来中途释放一个连接。
异常终止一个连接对应用程序来说有两个优点:
A: 丢弃任何待发数据并立即发送复位报文段;
B: RST的接收方会区分另一端执行的是异常关闭还是正常关闭。应用程序使用的API必须提供产生异常关闭而不是正常关闭的手段。
4: 检测半打开连接
A: 如果一方已经关闭或异常终止连接而另一方却还不知道,我们将这样的TCP连接称为半打开(Half-Open)的。
任何一端的主机异常都可能导致发生这种情况。只要不打算在半打开连接上传输数据,仍处于连接状态的一方就不会检测另一方已经出现异常。
B: 半打开连接的另一个常见原因是当客户主机突然掉电而不是正常的结束客户应用程序后再关机。这可能发生在使用PC机作为Telnet的客户主机上,
5: 同时打开
两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小。每一方必须发送一个SYN,且这些SYN必须传递给对方。这需要每一方使用一个对方熟知的端口作为本地端口。这又称为同时打开( simultaneous open)。
例如,主机A中的一个应用程序使用本地端口7777,并与主机B的端口8888执行主动打开。主机B中的应用程序则使用本地端口8888,并与主机A的端口7777执行主动打开。
6: 同时关闭
我们在以前讨论过一方(通常但不总是客户方)发送第一个FIN执行主动关闭。双方都执行主动关闭也是可能的, TCP协议也允许这样的同时关闭( simultaneous close)。
六:TCP选项:对应TCP首部的可选选项部分,这些选项的大多数只在最新的TCP实现中才能见到
1: 选项表结束:KIND(1B)
KIND = 0;
2: 无操作:KIND(1B)
KIND = 1
3: 最大报文长度:KIND(1B)+LEN(1B )+最大报文长度(2B)
KIND=2; LEN=4
4: 窗口扩大因子:KIND(1B)+LEN(1B)+移位数(1B)
KIND=3; LEN=3;
5: 时间戳:KIND(1B)+LEN(1B)+时间戳(4B)+时间戳应答(4B)
KIND=8; LEN=10;
七:TCP服务器设计
大多数的TCP服务器进程是并发的。当一个新的连接请求到达服务器时,服务器接受这个请求,并调用一个新进程来处理这个新的客户请求。
不同的操作系统使用不同的技术来调用新的服务器进程。
1: 呼入连接请求队列
A: 正等待连接请求的一端有一个固定长度的连接队列,该队列中的连接已被TCP接受(即三次握手已经完成),但还没有被应用层所接受。
注意区分TCP接受一个连接是将其放入这个队列,而应用层接受连接是将其从该队列中移出。
B: 应用层将指明该队列的最大长度,这个值通常称为积压值( backlog)。它的取值范围是0~5之间的整数,包括0和5(大多数的应用程序都将这个值说明为5)。
C: 积压值说明的是TCP监听的端点已被TCP接受而等待应用层接受的最大连接数。
这个积压值对系统所允许的最大连接数,或者并发服务器所能并发处理的客户数,并无影响。
D: 如果对于新的连接请求,该TCP监听的端点的连接队列中还有空间,TCP模块将对SYN进行确认并完成连接的建立。
但应用层只有在三次握手中的第三个报文段收到后才会知道这个新连接时。
另外,当客户进程的主动打开成功但服务器的应用层还不知道这个新的连接时,它可能会认为服务器进程已经准备好接收数据了(如果发生这种情况,服务器的TCP仅将接收的数据放入缓冲队列)。
E: 如果对于新的连接请求,连接队列中已没有空间, TCP将不理会收到的SYN。也不发回任何报文段(即不发回R S T)。
如果应用层不能及时接受已被TCP接受的连接,这些连接可能占满整个连接队列,客户的主动打开最终将超时。
由于不应答SYN,服务器程序迫使客户TCP随后重传SYN,以等待连接队列有空间接受新的连接。
TCP-IP详解卷1-18:TCP连接的建立与终止
最新推荐文章于 2024-09-16 13:39:47 发布
2874

被折叠的 条评论
为什么被折叠?



