三次握手和四次挥手

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

相关推荐

  • 三剑客之一sed命令

    sed sed ‘2p’ /etc/passwd  打印paswwd的第二行 这样执行结果看能看出第二行显示两次 sed -n ‘2p’ /etc/passwd -n 执行后 会取出当前行显示. n是关闭打印  例如[root@cent7 ~]#ifconfig ens33|sed -n &…

    Linux干货 2017-08-13
  • 第10周作业(上)

    第10周作业 1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)。CentOS系统启动详细的过程如下(以CentOS7为例): 加电自检(POST)按下电源开关,BIOS系统随即开始加电自检,检查CPU、内存、主板及各接口、硬盘、键盘、光驱等,检测它们的好坏。 读取启动顺序检查完成后,BIOS会根据预先设定好的启动顺序去挨个寻找可引导…

    Linux干货 2017-01-03
  • 使用 nice、cpulimit 和 cgroups 限制 cpu 占用率

    Linux内核是一名了不起的马戏表演者,它在进程和系统资源间小心地玩着杂耍,并保持系统的正常运转。 同时,内核也很公正:它将资源公平地分配给各个进程。 但是,如果你需要给一个重要进程提高优先级时,该怎么做呢? 或者是,如何降低一个进程的优先级? 又或者,如何限制一组进程所使用的资源呢? 答案是需要由用户来为内核指定进程的优先级 大部分进程启动时的优先级是相同…

    Linux干货 2015-02-14
  • Linux终端类型

    Linux终端类型 Linux系统中的终端基本都在/dev目录下,可分为文本命令行模式和图形界面模式。命令行模式是一种字符设备,通常使用tty来简称各种类型的终端设备。tty是Teletype的缩写。Teletype是最早出现的一种终端设备,很象电传打字机,是由Teletype公司生产的。 1、 物理终端 在Unix系统中,计算机显示器通常被称为控制台终端。…

    Linux干货 2016-10-14
  • 封装和结构及set

    封装|set

    Linux干货 2017-10-09
  • 网络管理之路由实现

    一.概述 跨网络通信:路由     路由分类:         主机路由         网络路由      …

    Linux干货 2016-09-19