Tcp 3次握手 4次挥手

标签(空格分隔): Java基础


报文介绍:

  • SYN(synchronous建立联机)
  • ACK(acknowledgement 确认)
  • FIN(finish结束)
  • PSH(push传送)
  • RST(reset重置)
  • URG(urgent紧急)
  • ESTABLISHED(建立连接)

状态介绍:

  • CLOSED(初始状态)
  • LISTEN(监听)
  • SYN_SENT(已发送SYN报文)
  • SYN_RCVD (接收到了SYN报文)
  • ESTABLISHED(已建立连接)
  • FIN_WAIT_1(等待FIN报文)
  • FIN_WAIT_2(半连接,还有数据需要传)
  • TIME_WAIT(收到FIN报文,发出ACK报文)
  • CLOSE_WAIT(等待关闭)
  • LAST_ACK(等待对方最后的去人报文ACK)

TCP建立连接->3次握手

过程描述:

  1. Client发送SYN,请求连接,状态SYN_SENT,等待Server回应
  2. Server收到SYN,发送SYN+ACK,状态SYN_RCVD
  3. Client收到SYN+ACK,发送ACK
  4. 客户端和服务端都进入ESTABLISHED(连接已建立)状态

思考:三次握手的必要性?

  client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

思考:为什么连接的时候是三次握手,关闭的时候却是四次握手

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

TCP数据传输

TCP关闭连接->4次挥手

    
过程描述:主动关闭方-Client

  1. Client发送一个FIN(关闭),告诉Server,我不会再发数据了.如果没收到回复,会重复发送FIN,此时的状态FIN_WAIT_1
  2. Server收到FIN,发送ACK,此时状态CLOSE_WAIT(等待关闭)
  3. Client收到ACK,但是没收到FIN,此时状态置为FIN_WAIT_2(继续等待,可接受数据)
  4. Server会继续发送数据
  5. Server发送完数据后,发送FIN(关闭)报文,此时状态LAST_ACK(就等ACK关闭连接了)
  6. Client收到FIN,发送ACK,状态置为TIME_WAIT
  7. Server收到ACK,关闭连接
  8. Client等待2MSL(及TIME_WAIT状态维持1-4分钟)后置为CLOSED状态

PS:MSL(即Maximum Segment Lifetime,):TCP报文在Internet上最长生存时间。
那么,2MSL也就是这个时间的2倍,当TCP连接完成四个报文段的交换时,主动关闭的一方将继续等待一定时间(2-4分钟),即使两端的应用程序结束

为什么有这个2MSL设置?

虽然双方都同意关闭连接了,而且挥手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文

一定是4次挥手断开连接吗?

不一定,如果没有数据需要传送了,Server可能一次回传ACK+FIN,4次挥手就会变为3次挥手完成关闭连接

关于‘TCP建立连接为什么是三次握手?’的另一种解释

这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了

总结

做了一个基本了解,有了解才有深入研究

参考文章
占小狼的博客-动画讲解TCP的3次握手,4次挥手
TCP三次握手、四次挥手及状态转换详解
关于TCP连接的3次握手和4次挥手
【TCP协议】(2)---TCP三次握手和四次挥手

Tcp 3次握手 4次挥手的更多相关文章

  1. [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解

    一.Linux服务器上11种网络连接状态: 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手. 注:以下说明最好能结合”图:T ...

  2. TCP三次握手/四次挥手详解

    一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能.包含以下四个层次: 1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程 ...

  3. TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释

    一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...

  4. TCP三次握手四次挥手详解

    转载 http://www.cnblogs.com/zmlctt/p/3690998.html 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需 ...

  5. wireshark抓包直观图解 TCP三次握手/四次挥手详解

    转http://www.seanyxie.com/category/linux/ 作者:seanyxie |   一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负 ...

  6. 转---tcp三次握手四次挥手syn fin......

    http://blog.chinaunix.net/uid-22312037-id-3575121.html转自 一.TCP报文格式        TCP/IP协议的详细信息参看<TCP/IP协 ...

  7. TCP三次握手/四次挥手

    TCP 三次握手 TCP 连接是通过三次握手进行初始化的.三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.以下步骤概述了通常情况下客户端计算机联系服务器计算机的过程: 1.  ...

  8. tcp三次握手四次挥手那些事

    建立TCP需要三次握手才能建立,而断开连接则需要四次挥手.三次握手,四次挥手流程图如下: 一.首先看下如何通过三次挥手----------建立连接 首先客户端发送连接请求报文,服务端接受连接后回复AC ...

  9. TCP三次握手四次挥手详解2

    相对应socket开发者,TCP创建过程和连接拆除过程是由TCP/IP协议栈自动创建的,因此开发者并不需要控制这个过程,但是对于理解TCP底层运作机制,相当有帮助 TCP三次握手 所谓三次握手,是指建 ...

随机推荐

  1. 2.2 logistic回归

    logistic回归,是一个学习算法,用在监督学习问题中, 输出标签y是0或者1的时候,这是一个二元分类问题, 给定一个输入x,一张图,你希望识别出这是不是猫图, 需要一个算法,可以给出一个预测值,我 ...

  2. cin和cout输⼊输出

    写再最前面:摘录于柳神的笔记:  就如同 scanf 和 printf 在 stdio.h 头⽂件中⼀样, cin 和 cout 在头⽂件 iostream ⾥⾯,看名字就知 道, io 是输⼊输出 ...

  3. 导入spark程序的maven依赖包时,无法导入,报错Unable to import maven project: See logs for details

    问题:导入spark程序的maven依赖包时,无法导入,且报错:0:23 Unable to import maven project: See logs for details 2019-08-23 ...

  4. Linux命令:tcpdump命令

    tcpdump网络抓包工具 格式:tcpdump [options] [表达式] optinos选项 -i any:监听所有网络接口 -i eth0:监听指定的网络接口(eth0) -D:列出所有可用 ...

  5. 【PAT甲级】1035 Password (20 分)

    题意: 输入一个正整数N(<=1000),接着输入N行数据,每行包括一个ID和一个密码,长度不超过10的字符串,如果有歧义字符就将其修改.输出修改过多少组密码并按输入顺序输出ID和修改后的密码, ...

  6. 「Luogu P2824 [HEOI2016/TJOI2016]排序」

    一道十分神奇的线段树题,做法十分的有趣. 前置芝士 线段树:一个十分基础的数据结构,在这道题中起了至关重要的作用. 一种基于01串的神奇的二分思想:在模拟赛中出现了这道题,可以先去做一下,这样可能有助 ...

  7. ubuntu 中怎么安装 jdk 7

    Jdk1.7 安装包的下载地址是: http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u4-downloads-1591156. ...

  8. Python - ORM(数据库相关)

    1. 概念 目标:类/对象操作 -> SQL语句 -> DB API -> 再在数据库中执行.ORM做前两部,因为ORM本身无法操作数据库.参考:https://baike.baid ...

  9. Solr与tomcat搭建(搭建好)

    https://pan.baidu.com/s/1kXagNYJ  密码:hgxd

  10. HTTP关键词收集

    [HTTP协议][客户端][服务器端][HTTPS][Web服务器][域名][DNS][IP地址][虚拟服务器][虚拟主机][中转服务器][HTTP/1.1规范][域名解析][Web托管服务][代理] ...