博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP通信
阅读量:5146 次
发布时间:2019-06-13

本文共 1106 字,大约阅读时间需要 3 分钟。

TCP通信

TCP通信过程包括3个步骤,分别是建立连接,传输数据,释放连接。

tcp_connect

建立连接:三次握手


TCP 通过三次握手建立连接,为什么要三次,是为了防止客户端发出的已失效的连接请求报文段又突然传送给了服务端而产生错误。

第一次握手:客户端发送 SYN 包(同步位 SYN=1,序号 seq=x,表明传送报文时的第一个字节序号是 x)给服务端,然后进入 SYN_SEND 状态,等待服务端的确认。

第二次握手:服务端收到 SYN 包,则发回确认(令同步位 SYN=1,标志位 ACK=1,确认号 ack=x+1,序号 seq=y),即发送 SYN+ACK 包给客户端,然后进入 SYN_RECV.

第三次握手:客户端收到 SYN+ACK 包后,向服务端发送确认包(ACK=y+1),然后进入 ESTABLISHED 状态。服务端收到后,也进入ESTABLISHED 状态,连接建立完成。

  • SYN_SEND:表示已发送 SYN 包,即同步已发送。
  • SYN_RECV:表示已收到 SYN 包,即同步已收到。
  • ESTABLISHED:表示已建立连接。

传输数据


TCP_transport

释放连接:四次挥手


这里假设是客户端发起断开连接。

第一次挥手:客户端停止发送数据,向服务端发送一个 FIN 包(令 FIN=1,序号 seq=u),然后进入 FIN_WAIT-1 状态。

第二次挥手:服务端收到 FIN 包后,会发出确认(ACK,令 ack=u+1,seq=v),然后进入 CLOSE_WAIT 状态。

客户端收到确认包后,进入 FIN_WAIT-2 状态,等待服务端发送释放连接报文,即 FIN 包。

在这时,TCP 已经进入连接半关闭状态,客户端已经不发送数据,服务端可能还会在发送数据。

这里假设服务端在这个阶段向客服端发送了一些数据,令序号为 w。

第三次挥手:服务端向客户端发送 FIN 包(令 FIN=1,ack=u+1),然后进入 LAST-ACK 状态。

第四次挥手:客户端收到 FIN 包后,会发出确认(ACK=1,ack=w+1, seq=u+1),然后进入 TIME-WAIT 状态,等到 2MSL 后,进入 CLOSE 状态。服务端收到确认后,也进入CLOSE 状态,连接正式关闭

  • FIN_WAIT-1/2:等待关闭状态。
  • LAST-ACK:最后确认状态。
  • TIME-WAIT:时间等待状态。
  • MSL:最长报文段寿命。
  • CLOSE:已关闭连接。

注:SYN、ACK、FIN报文是不能携带数据的,但要消耗掉一个序号。

转载于:https://www.cnblogs.com/guolao/p/10525654.html

你可能感兴趣的文章
01: socket模块
查看>>
mysql触发器
查看>>
淌淌淌
查看>>
web页面实现指定区域打印功能
查看>>
win10每次开机都显示“你的硬件设置已更改,请重启电脑……”的解决办法
查看>>
VMware环境和Window环境进行网络连接的问题
查看>>
macOS10.12允许所有来源设置
查看>>
C++有关 const & 内敛 & 友元&静态成员那些事
查看>>
函数积累
查看>>
python搜索引擎(转)
查看>>
关于height,line-height导致的样式混乱的问题
查看>>
《SEO实战密码》读后一点感受
查看>>
bzoj 4815 [Cqoi2017]小Q的表格——反演+分块
查看>>
Swift 入门之简单语法(六)
查看>>
shim和polyfill有什么区别
查看>>
Failed to load the JNI shared library “E:/2000/Java/JDK6/bin/..jre/bin/client/jvm.dll
查看>>
〖Python〗-- IO多路复用
查看>>
栈(括号匹配)
查看>>
夜太美---酒不醉--人自醉
查看>>
Java学习 · 初识 面向对象深入一
查看>>