三次握手和四次挥手

三次握手和四次挥手

  • 序号: 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关闭.
相关文章
相关标签/搜索