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

    TCP协议的三次握手和四次挥手

    三次握手

    三次握手,建立连接。

    • 第一握手,客户端向服务端发送建立连接的请求
    • 第二次握手,服务端如果同意连接,向客户端发送应答
    • 第三次握手,当客户端收到同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发送来的连接同意应答已经成功收到了

    反馈机制

    客户端往服务端发送请求,服务端必须返回响应,告诉客户端收到了请求,并且将服务器端的数据一并返回给客户端。

    ps:即一次请求,必须要有一次响应

    缺点:

    • 洪水攻击
      • 指的是通过伪造大量的请求,往对方服务器上发送请求,导致对方服务器响应跟不上,以至于瘫痪。
      • linux系统内部可以调整sysctl.conf文件里的net.ipv4.tcp参数抵挡较小的Dos攻击。(详情链接:https://www.cnblogs.com/cnhyk/p/11990401.html)
      • 半连接池listen:限制用户在同一时段内的访问数量。

    第一次握手

    客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1,ACK=0,seq=x。请求发送后,客户端便进入SYN-SENT状态。

    • PS1:SYN=1,ACK=0表示该报文段为连接请求报文。
    • PS2:x为本次TCP通信的字节流的初始序号。
    • TCP规定:SYN=1的报文段不能有数据部分,但要消耗掉一个序号。

    第二次握手

    服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。
    该应答发送完成后便进入SYN-RCVD状态。

    • PS1:SYN=1,ACK=1表示该报文段为连接同意的应答报文。
    • PS2:seq=y表示服务端作为发送者时,发送字节流的初始序号。
    • PS3:ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。

    第三次握手

    当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。
    报文段的头部为:ACK=1,seq=x+1,ack=y+1。

    客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成!

    为什么连接建立需要三次握手,而不是两次握手?

    防止失效的连接请求报文段被服务端接收,从而产生错误。

    PS:失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』。

    若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。

    作者:大闲人柴毛毛
    链接:https://www.zhihu.com/question/24853633/answer/254224088
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    四次挥手

    四次挥手,断开连接。

    • 客户端向服务器发送断开连接的请求
    • 服务端返回收到请求的信息给客户端
    • 服务端确认所有的数据接收完成以后,再发送给同意断开连接的请求给客户端
    • 客户端返回收到断开连接的请求,给服务端

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





  • 相关阅读:
    写在博客前面
    JavaAPI学习(一):API && String类 && Stringbuffer && StringBuilder
    Java面向对象(七):Object类 & 内部类 & 单例模式
    Java面向对象(六):抽象方法 & 接口 & 递归
    Java面向对象(五):OOP三大特性之多态 — final 关键字
    Java面向对象(四):OOP三大特性之封装与继承
    Java面向对象(三):Java权限修饰符—static关键字
    Java面向对象(二):成员变量—OOP中的内存管理—构造函数
    Java面向对象(一):方法—初识面向对象
    JavaSE学习(六):随机数—简单的排序算法
  • 原文地址:https://www.cnblogs.com/cnhyk/p/11990555.html
Copyright © 2011-2022 走看看