三次握手和四次挥手

TCP三次握手:

 三次握手和四次挥手

                                     3

第一次握手:建立连接。客户端发送位码为SYN=1,随机产生一个值seq=x(随机产生的一个序号)的数据包发送到服务器,要求建立连接,然后客户端进入SYN_SENT(同步已发送)状态,等待服务器的确认。

第二次握手:服务器收到请求要确认连接信息,发送SYN=1,ACK=1,ack=x+1(确认号,意思就是你发的x包我收到了,希望下次你发x+1的包),seq=y(随机产生),的数据包发送给客户端确认连接请求,服务器进入SYN_RCVD(同步收到)状态。(ACK表示标记位,ack表示确认号)

第三次握手:客户端收到后发送ACK=1(确认收到了服务器发的请求),seq=x+1(上次发送的是x包,这次发送x+1的包),ack=y+1(确认收到y给服务器,客户端和服务器都进入ESTABLISHED(已建立连接)状态,完成三次握手。

(之所以会是三次握手,是出于安全考虑。虽然三次握手也有隐患,相对来说较合适)

TCP四次挥手:(以客户端挥手为例)

 三次握手和四次挥手

                                          图2

第一次挥手:客户端发送FIN=1(发送关闭连接请求),seq=u去关闭客户端到服务器的数据传送,客户端进入FIN_WAIT_1(终止等待1)状态。

第二次挥手:服务器收到FIN后,发送ACK=1(关闭连接请求收到了)给客户机,seq=v(随机生成的号),ack=u+1(确认客户端发送的u收到了,希望下次发u+1),服务器进入CLOSE_WAIT(关闭等待)状态。

第三次挥手:服务器发送FIN=1,ACK=1,seq=w,ack=u+1(确认收到了u+1)用来关闭服务器到客户端的数据传送,服务器进入LAST_ACK(最后确认)状态。

第四次挥手:客户端收到FIN后,进入TIME_WAIT(时间等待)状态,接着发送ACK=1,seq=u+1(确认收到u+1),ack=w+1(收到w,希望下次发w+1)给服务器,服务器进入CLOSED状态,完成四次挥手。

状态:

CLOSED 没有任何连接状态

LISTEN 侦听状态,等待来自远方TCP端口的连接请求

SYN-SENT 在发送连接请求后,等待对方确认

SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认

ESTABLISHED 代表传输连接建立,双方进入数据传送状态

FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认

FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求

TIME-WAIT 完成双向传输连接关闭,等待所有分组消失

CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认

LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失

LOSING 双方同时尝试关闭传输连接,等待对方确认

注:
   1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
    这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
   2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
    这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

 


原创文章,作者:吼吼哈嘿,如若转载,请注明出处:http://www.178linux.com/85993

(0)
吼吼哈嘿吼吼哈嘿
上一篇 2017-09-02 19:42
下一篇 2017-09-02 20:36

相关推荐

  • lvs初探

    LVS 简述 HA基础知识 lvs配置 简述 什么是lvs? lvs是linux virtual server linux虚拟服务的缩写,通过一台调度服务器来调度收到的请求并分发给后端的real server。 lvs的功能是什么? lvs能够实现在大并发的情况下,将前端调度器收到的请求分发给后端服务器处理,实现了负载均衡集群的作用。 lb基础知识 lb集群…

    Linux干货 2016-05-31
  • MySQL 多实例详解

    目录 一、基本概念 1、MySQL多实例        就是在一台机器上面开启多个不同的端口,运行多个MySQL服务进程。这些MySQL多实例公用一套安装程序,使用不同的(也可以是相同的)配置文件,启动程序,数据文件。在提供服务时候,多实例MySQL在逻辑上看来是各自独立的,多个实例的自身是根据配置…

    Linux干货 2015-09-23
  • 马哥教育网络班20期-第三周课程作业

    Table of Contents 1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 2、取出最后登录到当前系统的用户的相关信息。 3、取出当前系统上被用户当作其默认shell的最多的那个shell。 4、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxusers…

    Linux干货 2016-06-26
  • Shell 变量类型及用法

    一、      什么是变量          变量源于数学,在计算机语言中能储存计算机结果或能表示值的抽象概念,变量可以由变量名访问,在指令语言中,变量通常是可变的。Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个…

    Linux干货 2016-08-12
  • 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

    设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序。但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关。例子1:银行业务办理流程在银行办理业务时,一般都包含几个基本固定步骤:取号排队->…

    Linux干货 2015-04-07
  • Mysql 备份

    Mysql 备份 ============================================================================= =============================================================================    &n…

    2016-11-22