zoukankan      html  css  js  c++  java
  • 三次握手和四次挥手

    三次握手和四次挥手

    • 序号: seq序号, 占32位, 用来标识从TCP源端向目地端发送的字节流, 发起方发送数据的时候对此进行标记。
    • 确认序号: ack序号占32位,只有ACK标志位为1的时候, 确认序号字段才有效,ack=seq+1.
    • 标志位: 共6个,即URG, ACK, PSH, RST, SYN, FIN等, 具体含义如下:
    • URG: 紧急指针.
    • ACK: 确认序号有效
    • PSH: 接收方应该尽快将这个报文交给应用层.
    • RST: 重置链接.
    • SYN: 发起一个链接.
    • FIN: 释放一个链接.

    首先Client端发送链接请求报文, Server端接收链接后回复ACK报文, 并为这次链接分配资源. Client端接收到ACK报文后也想Server端发送ACK报文, 并分配资源, 这样TCP就成功建立了链接.

    enter image description here

    最初的两端TCP进行都处于Closed关闭状态, A主动打开链接, 而B被动打开链接.

    • B的TCP服务器进程先创建传输控制块, 准备接收客户端进程的连接请求. 然后服务器进程就处于Listen状态, 等到客户的连接请求.
    • 第一次握手: A的TCP客户端进程创建传输控制块TCB, 然后向B发出链接请求报文段, 这时候会给一个 随机的x 并且SYN=1, 处于发起一个链接的请求.
    • 第二次握手: B收到连接请求报文之后, 也收到了A给的随机x, 这时候给一个 SYN=1 处于请求链接阶段, ACK=1 确认序号是有效的, 并且随机发送一个y 和 ack=x+1, 确认这个请求是第一次握手的第二次回复.
    • 第三次握手: TCP客户进程收到B的确认之后, 给B确认报文段 ACK=1 确认号ack=y+1, 序号seq=x+1
    • 当B收到A的确认消息之后, 链接建立成功.

    • 第一次握手: 起初的时候两端都处于Closed 关闭状态, Client将标志位SYN至为1, 随机产生一个seq=x, 并将该数据包发送给Server, Client进入SYN-SENT状态, 等待Server的确认.
    • 第二次握手: Server收到数据报之后由标志位SYN=1得知 Client请求建立连接, Server将标志位SYN和ACK都设置位1, ack=x+1, 随机产生一个seq=y, 并且将该数据报发送给Client以确认请求, Server进入SYN-RCVD状态, 此时操作系统位TCP链接分配TCP缓存和变量.
    • 第三次握手: Client收到确认之后, 检查ack是不是x+1, ACK是否为1, 如果正确则将标志位ACK至为1, ack=y+1, 并且此时操作系统为该TCP链接分配TCP缓存和变量, 并将该数据包发送给Server, 此时Server检查ack是不是y+1, ACK是否为1, 如果是则链接链接成功.

    SYN攻击.

    游戏中的炸房就是这个原理. 服务器端的资源分配是在第二次握手的时候分配的, 而客户端的资源是在第三次握手的时候分配的, 所以服务器容易受到SYN攻击, SYN攻击就是客户端在短时间内伪造大量不存在的IP地址, 并向Server不断的发送SYN包, Server则回复确认包, 等到Client的确认 然后自己确认二次握手的信息完成 TCP建立, 但是 因为Server需要回复第一握手的SYN, 并且IP是伪造的, 所以Server需要不断发送直至超时, 这样就造成了大量的资源浪费, 引起来网络拥塞设置系统瘫痪.

    四次挥手

    假设Client端发送中断连接请求, 也就是FIN. Server端收到了FIN之后就知道 客户端没有消息需要发送给服务端了, 但是如果服务端还有消息没有发送完毕的话 就不着急关闭
    Socket, 可以继续发送数据, 但是服务端是知道客户端任务已经完成的了, 所以这个时候发送ACK=1 告诉客户端, 你的关闭请求我知道了, 但是我这边还需要给你发送消息, 你再等等我的消息. 当服务端完成任务之后, 服务端给客户端 发送FIN, 客户端接收到FIN之后就知道服务器也准备好了. 然后客户端给服务器发送消息说 我要关闭连接了, 然后等待一段时间, 如果服务器没有再次发送消息, 就说明他收到了上一条消息, 然后大家就都关闭了.
    enter image description here

    • A的应用进程先向TCP发送链接释放报文段(FIN=1, 序号seq=u), 并停止继续发送消息. A发送链接释放报文段的意义就是说自己的活干完了, 我这边可以结束连接了.
    • B收到之后发送确认报文段(ACK=1, 确认号ack=u+1, 序号seq=v). 然后B进入关闭等待状态, 此时TCP处于半 关闭状态, A到B的链接释放. 然后B速度完成自己的任务.
    • A收到B的消息之后, 进入等待状态, 等待B完成自己的任务.
    • B任务完成, 然后B请求释放链接. (FIN=1, ACK=1,seq=w, 确认号ack=u+1), B进入最后确认状态, 等待A的确认.
    • A收到B的链接释放报文之后, 对此发出报文段 (B收到消息, 然后关闭. B没有收到消息, 一段时间后再次四次挥手.), 然后进入等待关闭状态, 如果B一段时间内没有回复消息就说明已经收到了A的确认关闭消息, 然后A关闭.
  • 相关阅读:
    Django时区导致的datetime时间比较报错
    Django 插件之 Xadmin实现富文本编辑器
    xadmin自定义菜单、增加功能、富文本编辑器
    virtualenv虚拟环境搭建及pipreqs自动生成第三方模块简介
    Selenium 多窗口元素定位处理
    selenium 消息框元素定位处理
    无界面运行Jmeter压测脚本
    网站死链的扫描
    Jmeter关联处理
    逻辑思维训练
  • 原文地址:https://www.cnblogs.com/A-FM/p/11764991.html
Copyright © 2011-2022 走看看