zoukankan      html  css  js  c++  java
  • tcp/ip 三次握手和4次挥手

    TCP连接两个端口,谁也发起请求,谁就是client端A,另外一个接受请求的server端B。
    第一次握手:
    A向B发一个链接请求,带一个seq = x,SYN= x.

    第二次握手:
    B收到链接请求之后向A回复一个ACK = x + 1, SYN =1(这里为啥都带给SYN = 1,因为SYN=1的报文段不能带数据.并且这是一个链接请求)。
    如果同意,则发回确认。B发回:SYN = 1,ACK = 1.ack = x+1.seq = y.
    (如果只要两次,意味着B这个时候要处于已经建立链接的状态,因为只有B先建立链接才能保证A收到B的回信就可以开始通信。这会产生一个致命问题,如果A没有收到B的回复,那么A不知道这个链接,这个链接就不会被使用也得不到释放,所以B在这个时候不能建立链接)

    第三次握手:
    A收到B的确认后,发出报文给B确认,其ACK=1.确认号ack = y+1.A的TCP通知上层应用进程,链接已经建立。
    B的TCP收到主机A的确认后,也通知其上层应用进程,此时TCP链接已经建立。ACK报文可以携带数据,(因为没有SYN=1).如果不携带数据则不消耗序号。

    另外:

    也是很好的总结,好好看看:http://www.cnblogs.com/Jessy/p/3535612.html

    为什么挥手比握手多一次呢?

    答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。
    只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

  • 相关阅读:
    用户控件JS问题
    jQuery formValidator自定义函数扩展功能
    IAR使用notice
    C++入门学习
    解决Myeclipse闪退问题
    Cortex_M3——存储器系统学习笔记
    加密算法中涉及C/C++总结
    学习笔记——应用密码学基础
    keil软件相关问题汇总
    STM32知识点纪要
  • 原文地址:https://www.cnblogs.com/heylinart/p/7782334.html
Copyright © 2011-2022 走看看