三次握手和四次挥手

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
下一篇 2017-09-02

相关推荐

  • N21-天天-第九周课程练习

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash awk -F: '$NF~"/sbin/nologin" {shell++} $NF!~&qu…

    Linux干货 2016-09-01
  • MySQL 简述

    1 概述
    2 安装
    3 数据库的操作
    4 注意事项

    Linux干货 2017-09-25
  • Linux开班典礼

    心得体会和近一周学习计划

    2018-03-26
  • 编译安装httpd

                   1 将 httpd-2.4.25.tar.bz2下载 到  centos7的 /app目录下                 [root@localh…

    Linux干货 2017-04-24
  • linux发展简史

    前言 为什么要写这么一篇文章呢?我发现我虽然知道linux的一些知识,却不知道linux方面的历史,所以今天写一篇关于linux方面历史的文章,用来总结这段时间自己所学习到的关于linux的历史与linux的知识。关于说起linux的历史,就不得不介绍计算机的历史,与其他相关操作系统的一些历史,所以本文中的会简单介绍Linux与其他操作系统的关系。主要讲li…

    Linux干货 2017-02-16
  • bash编程函数select语句的使用

    £select             select循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3提示符,等待用户的输入,用户输入菜单列表中的某个数字,执行相应的命令,用户输入被保存在变量REPLY中。 select是个…

    Linux干货 2016-08-24