TCP/IP 第18章 tcp连接建立和终止

额。。。比较重要的一章,必须认真看,over,let's go。。。


第18章 tcp连接建立和终止


1. TCP连接的建立于终止

TCP/IP 第18章 tcp连接建立和终止_第1张图片
TCP/IP 第18章 tcp连接建立和终止_第2张图片

建立连接,3次握手,终止连接,4次握手,两端都可以主动发起断开连接,一端主动,则令一端则被动。

2. 连接建立的超时

TCP/IP 第18章 tcp连接建立和终止_第3张图片


3、TCP连接状态变迁图
TCP/IP 第18章 tcp连接建立和终止_第4张图片
TCP/IP 第18章 tcp连接建立和终止_第5张图片
所要表述的知识点,上面两个图已经说明的很详细了,不再赘述。
TIME_WAIT:2MSL超时状态,这个状态是执行主动关闭,最终要进入的状态,进入TIME_WAIT状态之后,只有经历2MSL超时之后,连接才最终销毁,在TIME_WAIT状态下,其占用的端口号不能在被使用。MSL时间可以为30s,1min或2min。
FIN_WAIT_2:如果执行半关闭,如果对端不执行关闭,则本段将永远置于FIN_WAIT_2状态,并且对端永远置于CLOSE_WAIT状态。

4、复位报文段

异常情况,会发送rst消息,用于异常终止连接。对于rst消息是不需要回响应的。有如下异常情况:
1、到不存在的端口连接请求,对于udp连接,如果目的端口没在使用,则会产生ICMP端口不可达消息,对于TCP则会产生rst消息。
2、异常终止一个连接,如果本端发生异常,无法正常关闭(发送fin消息),则只能发送rst消息。这样做有2个好处,本端丢弃未发送的数据;rst接收方可以区分是正常关闭还是异常关闭。
3、检测半打开连接,比如服务端已经关闭(异常关闭,如机器重启,或fin消息丢掉),而客户端并不知道服务端已经关闭,所以这个时候,客户端则处于半打开连接,如果这个时候客户端又向服务端发送数据,由于服务端已经断开连接(如重启机器),并不知道这个数据从哪来的,先前没有经过3次握手建立连接,则只能回复rst消息,告知客户端异常关闭。
4、socket通信,如下设置可以启用rst。
struct linger linger = {1, 0};
setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger));

5、同时打开

TCP/IP 第18章 tcp连接建立和终止_第6张图片
注意同时打开建立的是一条连接,除了回复对端的syn消息ack,同时本段的syn需要发送2次。

6、同时关闭

TCP/IP 第18章 tcp连接建立和终止_第7张图片

7、TCP选项

TCP/IP 第18章 tcp连接建立和终止_第8张图片
TCP/IP 第18章 tcp连接建立和终止_第9张图片

无操作字段是用来填充4个字节的。如窗口扩大是3个字节,则需要在其前面加入一个NOP,填充成4个字节。

8、TCP服务器

对于tcp服务器,当新的连接来了之后,或者新起进程或者新起线程来处理新的连接。如果新的连接来了之后,
netstat -nat(n:不做域名解析、a:all、t:tcp)如下图所示
始终有一个连接处于listen状态。

呼入连接队列:简单说就是,客户端、服务器,当服务端很忙,此时有新的客户连接来了,服务端一时半会还无法处理,tcp先将客户请求放到连接请求队列中,在队列中直接完成3次握手,当服务端完成手头事情之后,再从连接队列中取出连接(注意此时3次握手已经ok)。如果连接队列已满,又来连接请求,则忽略该次syn消息,这样客户端就会超时重传,直到队列有空闲位置来处理本次连接。

你可能感兴趣的:(TCP/IP 第18章 tcp连接建立和终止)