客户端和服务器 , 双方都处于第一次交互的情况下展开通信
三次握手
1. 首先 服务器 需要是处于 listen 收听状态下才能接受报文客户端由 closed 状态 打开并向服务器发送报文 SYN=1 申请建立联机 seq=a (这里的 seq 的顺序号也就是 tcp 包头的序号, 如果双方通信次数)???? 2. 第二步: 服务器 B 返回信息 ACK=1 已收到确认 并向 A 也发送一个包请求通讯 seq=b1 ack 确认号也要 + 1(这里为什么要 + 1 是因为 B 已经收到了 ack 包 如果你再发的话需要你发 ack+1 的包)而大写的 ACK 是确认号 表示前面 f 发过来的那个包 或者字段是否有效. 当 ACK=1 时, 前面的确认号字段才有效. 0 则无效这时候服务器和客户端都处于 SYN-RCVD 状态 (同步收到)? 3. 第三步: 客户端返回服务器首先大写的 ACK=1 确认有效性这时候 客户端 A 要再给服务器 B 发的包的话. seq 的顺序号就要 + 1 了也就是 seq=a+1 并且在给服务器 B 返回 ack=y+1 也就是告诉 b 你上一个 ack=y 的包我已经收到了 再发的话需要你发 y+1 的包? 这时候服务器和客户端的状态都处于 ESTAB-LISHED(已建立连接状态)
4. 之后 客户端 a 和服务器 b 就可以进行正常的数据传送了
???
四次挥手
还是 A 客户端 B 服务器一般都是客户端对服务器发起请求断开链接当然 服务端也可以向客户端发起断开链接的请求(用客户端向服务器提出断开链接 举例子)
? 当需要断开链接的时候
? 第一步: 客户端 A 对服务器 B 发出 FIN=1 的数据包(FIN(finish 结束))seq=u 包的序号并且客户端的状态从建立链接 ESTAAB-LISHED 状态切换到 FINWAIT-1 终止等待状态 seq=u 序号为 u 的包?? 第二步: 服务器返回 ACK(acknowledgement 确认) 确认接收到 断开链接的包了 返回 ack=u+1 并告知客户端. 你的上一个包已经收到. 下次再发请发 ack=u+1 的包并且. 返回的给客户端的报头编号为 seq=vack=u+1
服务器的状态变更为 close-wait 关闭等待
客户端接收到第二步的包时 客户端的状态立即切换到 FIN-WAIT2 终止等待 2 的状态
?? 第三步: 由于客户端已经对服务器发起了断开链接请求. 也就是客户端已经没有数据向服务器发送了.. 但是服务器可能还有数据没有对客户端传送完毕. 当服务器对客户端的数据传送完毕之后会对客户端在发起新的数据报文 FIN=1 确认关闭 ACK=1 seq=w 序列号 (这里的为什么不是 V+1 因为 第三步和第四部之间 服务器会给客户端传送剩余的数据, 所以这里的 seq 编号. 就变很多了, 暂且用 w 表示 而不是 seq=v+1)ack=u+1 确认 客户端的状态变更为 last-ack 最后确认 状态? ? 第四步: 当客户端收到了 第三步的包立即回应 并确认 断开链接 ACK=1 seq=u+1 ack=w+1 并且客户端的状态 切换到 time-wait 时间等待 状态 (由于网络的情况或许有延迟, 丢包等情况, 有可能会出现 数据还没传送完毕. 但是服务端的确认断开链接的报头先到了.. 为了保证接收到了所有数据. 客户端会等待一段时间, 等待 2MSL (1))
? ?
第五步: 服务器当收到客户端的第四步回应的报头 直接就处于 closed 关闭状态了
客户端需要 等待 2MSL 后 才会进行 closed 关闭状态
??
补充: MSL 是什么; aximum Segment Lifetime 报文的最大生命时间. 何报文在网络上存在的最长时间, 超过这个时间报文将被丢弃
??
有限状态机 FSM:Finite State Machine
CLOSED 没有任何连接状态 LISTEN 侦听状态, 等待来自远方 TCP 端口的连接请求 SYN-SENT 在发送连接请求后, 等待对方确认 SYN-RECEIVED 在收到和发送一个连接请求后, 等待对方确认 ESTABLISHED 代表传输连接建立, 双方进入数据传送状态 FIN-WAIT-1 主动关闭, 主机已发送关闭连接请求, 等待对方确认 FIN-WAIT-2 主动关闭, 主机已收到对方关闭传输连接确认, 等待对方发送关闭 传输连接请求 TIME-WAIT 完成双向传输连接关闭, 等待所有分组消失 CLOSE-WAIT 被动关闭, 收到对方发来的关闭连接请求, 并已确认 LAST-ACK 被动关闭, 等待最后一个关闭传输连接确认, 并等待所有分组消失 CLOSING 双方同时尝试关闭传输连接, 等待对方确认
???
TCP 包头
URG: 表示本报文段中发送的数据是否包含紧急数据. 后面的紧急指针字段 (urgent pointer) 只有当 URG=1 时才有效 ACK: 表示是否前面确认号字段是否有效. 只有当 ACK=1 时, 前面的确认号字段才有效. TCP 规定, 连接建立后, ACK 必须为 1, 带 ACK 标志的 TCP 报文段称为确认报文段 PSH: 提示接收端应用程序应该立即从 TCP 接收缓冲区中读走数据, 为接收后续数据腾出空 间. 如果为 1, 则表示对方应当立即把数据提交给上层应用, 而不是缓存起来, 如果应用程序 不将接收到的数据读走, 就会一直停留在 TCP 接收缓冲区中 RST: 如果收到一个 RST=1 的报文, 说明与主机的连接出现了严重错误(如主机崩溃), 必 须释放连接, 然后再重新建立连接. 或者说明上次发送给主机的数据有问题, 主机拒绝响应, 带 RST 标志的 TCP 报文段称为复位报文段 SYN: 在建立连接时使用 用来同步序号. 当 SYN=1,ACK=0 时 表示这是一个请求建立连 接的报文段当 SYN=1,ACK=1 时, 表示对方同意建立连接. SYN=1, 说明这是一个请求 建立连接或同意建立连接的报文. 只有在前两次握手中 SYN 才置为 1, 带 SYN 标志的 TCP 报文 段称为同步报文段 FIN: 表示通知对方本端要关闭连接了, 标记数据是否发送完毕. 如果 FIN=1, 即告诉对方: "我的数据已经发送完毕, 你可以释放连接了", 带 FIN 标志的 TCP 报文段称为结束报文段
来源: http://www.bubuko.com/infodetail-2745045.html