超详细TCP三次握手和四次挥手

(以下图片出自51韩老师课程ppt 以获得本人同意)

TCP传输连接管理

TCP协议是可靠传输的 使用TCP通讯有三个阶段,分别为连接建立、数据传送、和连接释放。
TCP连接的建立都是采用客户服务器的方式
主动发起连接建立的应用进程叫客户(client)
被动等待连接建立的应用进程叫服务器(server)

连接建立和数据传输

TCP的连接建立是通过三次握手来建立
syn:同步数据包 ack:确认标记 seq:序号 是一个数值

这里写图片描述
客户端要访问一个服务 首先需要建立连接进行通讯
①A计算首先发一个同步数据包标记为1 确认标记为0 也就是说这个确认号没有用 序号为x(一个数值可能是10也可能是1)
②计算机B收到这样一个数据包就知道是一个要主动建立连接的数据包 于是B计算机就开始发一个数据包作为回应
B发给A的确认号为x+1(就是收到的序列号+1)
③A收到确认之后 A再给B发一个数据包 这时的数据包就没有syn了 确认号是1 告诉B 发给它数据包就是第x+1个字节 确认号为y+1 告诉B下次发数据应该发y+1那个字节了(第三次握手

这里写图片描述
①②足以能够证明网络是畅通 并且足以协商所需要的参数 为什么需要③再次确认?
当A给B发起一个建立连接的请求 但它可能选的一个比较远的网络 传的时间就比较长 A等了一会发现自己发了个请求没搭理 结果又发一遍重新发个请求 这个数据包很快直接到了B B给的确认也很快 过了一会之前走远路的也到了 B又给一个确认 这个时候这个确认A计算就不认了 但B还在等 所以造成了B计算机的资源浪费 这种情况多了B可能就瘫了 这时有了第三次连接 B收到了第三次确认就不等了

各个连接的状态
这里写图片描述
①A给B发了一个建立连接的请求之后 状态变为syn-sent(发送synsent)
②B收到之后给个确认 这时B的状态变为syn-rcvd
③A收到B的确认之后 A的状态变为estab-lished
④当B再次收到A的确认之后 B的状态变为estab-lished
⑤它们的状态都变为estab-lished之后才开始传输数据
这里写图片描述
通过netstat - n可以查看状态
我们可以看到一些syn_sent的状态 从上面的分析可以知道 此时对方是没有确认的(比如我们访问一个不存在的ip,过一会就没了)
通过syn攻击我们可以看到syn-rcvd状态(这里没演示syn攻击)其实就是伪造地址发送连接请求 B收到后就发送确认结果对方一直没回复 所以就会出现这种syn-rcvd这种状态
只要建立了通讯就是estab-lish状态

连接释放

这里写图片描述
数据传输结束后,那么就可以释放了。
①A首先给B发一个数据包 FIN标记为1 就是说A要主动关闭TCP连接了
②B收到之后给个确认 这时A就不会给B发了 但B还可以给A发(B还没说要结束)
③如果B也发了一个 FIN标记 表示B也要关了
④A收到之后 给B发个确认
各个状态和上面建立连接的状态一样分析 这里就不一 一指出了
主要是看最后一个状态 (这里也就会第四次挥手)
最后一个状态time-wait得等待2MSL(报文最大生存时间 MSL一般是2分钟 所以这里就是4分钟) 也就是A最后得等4分钟才结束
为什么要等待呢?
如果没有等待 要是最后一个数据包丢了 那么B又发一个过去 但这时A已经关闭了 A就不回复了 这时B就关不了了
如果有等待 就算包丢了 A还没关 A还能再发

猜你喜欢

转载自blog.csdn.net/qq_37617238/article/details/81092046