网络设备要相互通信,双方要基于相同的一种规则,称为协议 protocol
协议族
TCP/IP是互联网相关的种类协议族的总称
通信工作方式
通过分层顺序与对方进行通信,发送端从应用层往下走,接收端着往应用层往上走
IP协议 Internet Protocol
- 位于网络层负责传输
- 几乎所有合用网络的系统都会用IP协议
作用是把数据包传送给对方
提供可靠性的字节流服务
SYN Synchronize Sequence Numbers 同步序列编号
- ACK Acknowledgement 确认字符
状态
- LISTEN 侦听 TCP 端口的连接请求 (我等着你发送连接请求呢)
- SYN-SENT 在发送连接请求后等待匹配的连接请求(我发送了连接请求,我等你回复哈)
- SYN-RECEIVED 在收到和发送一个连接请求后等待对连接请求的确定(我收到你的连接请求了哈,我等你回复我)
- ESTABLISHED 代表一个打开的连接,数据可以传送给用户 (建立建立了哈,我跟你说一下)
主 | 宾 | 谓 | 状 | |
---|---|---|---|---|
第一次握手 | 客户端 | 服务器 | 发送 SYN 标志位(序号是 J ) | 进入 SYNC_SENT 状态 (等待服务器确认状态) |
第二次握手 | 服务端 | 客户端 | 1. 收到 SYN J 2. 确认该数据包已收到 3. 发送 ACK 标志位 (序号是 J + 1)和 SYN 标志位 (序号是 K) |
进入 SYNC_RECV 状态 (请示接收并等待客户端确认状态) |
第三次握手 | 客户端 | 服务器 | 发送 ACK 标志位(序号是 K + 1)确认客户端已收到建立连接确认 |
进入 ESTABLISHED 状态 (连接建立状态) |
服务器 | 收到 ACK 标志位 | 进入 ESTABLISHED 状态 (连接建立状态) |
四次挥手 four-way handshaking
标志位(数据包)
- FIN Finsh 关闭完成
状态
- FIN-WAIT-1 等待远程 TCP 的连接中断请求,或先前的连接中断请求的确认
- FIN-WAIT-2 从远程 TCP 等待连接中断请求
- CLOSE-WAIT 等待从本地用户发来的连接中断请求
- LAST-ACK 等待原来发向远程 TCP 的连接中断请求的确认
- TIME-WAIT 等待足够的时间以确保远程 TCP 接收到连接中断的请求确认
- CLOSED 没有任何连接状态
主 | 宾 | 谓 | 状 | |
---|---|---|---|---|
第一次挥手 | 客户端 | 服务器 | 发送连接关闭报文(已经停止发送数据) - 报文首部:FIN=1(序列号 seq=u) |
进入 FIN-WAIT-1 状态 (终止等待2) |
第二次挥手 | 服务器 | 客户端 | 1. 收到连接关闭报文 2. 发送确认报文 - 报文首部:ACK=1 ack=u+1(序列号 seq=v) |
进入 CLOSE-WAIT 状态 (连接半关闭状态) |
客户端没有数据要发送,但服务器如果还要发送数据,客户端依然需要接受 所以服务器在这期间还要确认客户端所需要的数据是否真的发送完毕了,如果还没有发送完,则继续发送数据 |
||||
客户端 | 收到确认请求 | 进入 FIN-WAIT-2 状态 (终止等待2) |
||
第三次挥手 | 服务器 | 客户端 | 1. 确认数据已经发送完毕 2. 发送连接关闭报文 - 报文首部:FIN=1 ACK=1 ack=u+1(确认上一次数据包)(序列号 seq=w) |
进入 LAST-ACK 状态 (最后确认) |
第四次挥手 | 客户端 | 服务器 | 1. 收到连接关闭报文 2. 发出接收确认报文 - 报文首部:ACK=1 ack=w+1(确认上一次数据包)(序列号 seq=u+1) |
进入 TIME-WAIT 状态 (时间等待) |
TIME-WAIT 时长: 2MSL (Maximum Segment Lifetime 最大报文生存时间) MSL 的值根据不同的情况而不同,一般是 30 秒、1 分钟、2 分钟 目的: 保证客户端发送的最后一个报文能够发到服务器,一旦报文丢失,服务器会认为自己最后一次发送的 FIN+ACK 包,客户端并没有收到,此时服务器会重新发送一次 FIN + ACK 包,而客户端可以在 2MSL 的 TIME-WAIT 时间内收到重新传输的 FIN + ACK 包,接着重新进行第四次挥手,并重启 2MSL 计时器。 |
||||
服务器 | 收到确认 | 立即进入 CLOSED 状态 (TCP 关闭状态) |
||
TCP 连接结束,TCP 关闭服务端要比客户端早一些 |
- Q:为什么是四次握手?
A:第一次挥手的时候发送了FIN包,服务器接收到以后,表示客户端不再发送数据了,但还能接收数据。这时服务器先向客户端先发送确认包,并且确认自己是否还有数据没有发送给客户端,这个确认的阶段是CLOSE-WAIT,所以在终止等待1(CLOSE-WAIT)的开始和结束需要各发送一个包,状态开始时向客户端发送的包是确认收到来自客户端的FIN包,状态结束时向客户端发送的是确认数据已经完整发送, 所以是四次挥手。 - Q:TCP连接建立后,客户端突然出现故障?
A:TCP保活计时器:客户端如果出现故障,服务器每收到一次客户端的请求后都会重新复位保活计时器,时间通常是2小时,若2小时还没有收到客户端的数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍无反应,服务器就认为客户端出了故障,此时将关闭连接。