TCP-三次握手和四次挥手简单理解

背景:TCP,即传输控制协议,是一种面向连接的可靠的,基于字节流的传输层协议。作用是在不可靠的互联网络上提供一个可靠的端到端的字节流服务,为了准确无误的将数据送达目的地,TCP协议采纳三次握手策略。

一、TCP报文

TCP报文格式图:

上图中的几个字段需要重点介绍下:

字段 介绍
序列号seq 占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序列号,第一个序列号由本地随机产生;给字节编上序号后,就给每一个报文指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认号ack 占4个字节,期待收到对方下一个报文段段的一个数据字节的序号;序列号表示报文段携带数据段第一个字节的编号;而确认号指的是期望接受到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
确认ACK 占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效。
同步SYN 连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标准位只有在TCP建成连接时才会被置1,握手完成后SYN标志位被置0。
终止FIN 用来释放一个连接。FIN=1表示:此报文段段发送方的数据已经发送完毕,并要求释放运输连接。

PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

标志位:

字段 含义
URG 紧急指针是否有效。为1时,表示某一位需要被优先处理。
ACK 确认号是否有效,一般置为1。
PSH 接收方应该尽快将这个报文交给应用层。
RST 重置连接。
SYN 发起一个新连接。
FIN 释放一个连接。

注意:不要将确认序号ack与标志位中的ACK搞混了。

二、三次握手(Three-Way Handshake)

原理:

第一次握手:建立连接是,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列号。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

为什么要三次握手?

三次握手的最主要目的是「双方确认自己与对方的发送与接收是正常的」。

第一次握手:Client什么都不能确认;Server确认了对方发送正常。

第二次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己接受正常,对方发送正常。

第三次握手:Client确认了:自己发送、接受正常,对方发送,接受正常;Server确认了:自己发送了、接受正常,对方发送、接受正常。

所以三次握手就能确认双方收发功能是否正常。

通俗的说法:

Client:喂!听的到吗?

Server:可以,我听的到。

Client:好的,我们都能互相听的对方的话,可以开始通信了。

三次握手为什么不用两次,或者四次?

因为只有三次才最合适,三次通信是最小值,两次通信无法确认双方收发功能的正常,而四次通信则显得有些冗余。

三、四次挥手(Four-Way Wavehand)

意义:

所谓四次挥手,即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务的总共发送4个包以确认连接到断开。在socket编程中,这一过程由客户端或服务的任意一方执行close来触发,流程如下图所示:

由于TCP连接时是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是主动方完成数据发送任务后,发送一个FIN来终止主动方发送数据的连接,收到一个FIN只是意味着这一方向上没有数据流动来,即不会再收到主动方的数据,但是在这个TCP连接上被动方仍然能够发送数据,直到被动方也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

原理:

第一次挥手:Client发送一个FIN,用来关闭CIient到Server的数据传输,Client进入FIN_WAIT_1状态。

第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到,序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传输,Server进入LAST_ACK状态。

第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到,序号+1,Server进入CLOSED状态,完成四次挥手。

通俗的说法:

Client:我已经说完了。

Server:我收到了,等等我,我还没说完。

Server:好了,我也说完了。

Client:好的,那我们通信结束。

上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起关闭的情况,如下图所示:

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接是,当收到对方的FIN报文是,仅仅表示对方不再发送数据了,但是还能接收数据,已方也未必全部数据都发送给对方了,所以已方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,已方ACK和FIN一般都会分开发送。

TCP-三次握手和四次挥手简单理解的更多相关文章

  1. 谈谈你对 TCP 三次握手和四次挥手的理解

    TCP三次握手: 1.客户端发送syn包到服务器,等待服务器确认接收. 2.服务器确认接收syn包并确认客户的syn,并发送回来一个syn+ack的包给客户端. 3.客户端确认接收服务器的syn+ac ...

  2. 【笔记】关于TCP三次握手和四次挥手的理解

    1. 三次握手: 服务器一定处于Listen状态,否则客户端发过来的连接会被拒绝.注:服务器和客户端的角色是相对的. 客户端发送第一次握手(客户端发送连接请求(SYNC包)到服务器)之后由Closed ...

  3. TCP三次握手及四次挥手详细图解

    TCP三次握手及四次挥手详细图解 Andrew Huangbluedrum@163.com    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不 ...

  4. 用wireshark抓包分析TCP三次握手、四次挥手以及TCP实现可靠传输的机制

    关于TCP三次握手和四次挥手大家都在<计算机网络>课程里学过,还记得当时高超老师耐心地讲解.大学里我遇到的最好的老师大概就是这位了,虽然他只给我讲过<java程序设计>和< ...

  5. 应聘复习基础笔记1:网络编程之TCP与UDP的优缺点,TCP三次握手、四次挥手、传输窗口控制、存在问题

    重要性:必考 一.TCP与UDP的优缺点 ①TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供 ...

  6. 【HTTP协议】---TCP三次握手和四次挥手

    TCP三次握手和四次挥手 首先我们知道HTTP协议通常承载于TCP协议之上,HTTPS承载于TLS或SSL协议层之上 通过上面这张图我们能够知道.     在Http工作之前,Web浏览器通过网络和W ...

  7. 网络通信 --> TCP三次握手和四次挥手

    TCP三次握手和四次挥手 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 一.TCP报文格式 如下图: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发 ...

  8. 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    .引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...

  9. TCP‘三次握手’和‘四次挥手’(通俗易懂)

      概述 我们都知道 TCP 是 可靠的数据传输协议,UDP是不可靠传输,那么TCP它是怎么保证可靠传输的呢?那我们就不得不提 TCP 的三次握手和四次挥手. 三次握手 下图为三次握手的流程图 下面通 ...

  10. 【转】TCP三次握手和四次挥手全过程及为什么要三次握手解答

    TCP三次握手和四次挥手的全过程   TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种表示: SYN(synchronous建立连接) ...

随机推荐

  1. spring配置文件的部分配置文字说明

    http://blog.csdn.net/zzjjiandan/article/details/22922847/ spring的组成: <beans> <contenxt> ...

  2. Java面向对象(一)类和对象

    面向过程和面向对象的区别 面向过程,强调的是功能行为,是将实现一个功能的步骤编写在一个函数中,以函数为最小单位. 面向对象,是将需要的功能封装进一个对象中,使一个对象具有很多的功能特征,以类/对象为最 ...

  3. 设置CMD窗口为UTF-8编码

    Windows下的CMD窗口默认是采用非UTF-8编码的,有时候运行一些UTF-8编写的批处理文件在控制台中的输出就是乱码, CHCP是MD DOS中的命令,用来显示或设置活动代码页编号的.用法是:  ...

  4. 面试WEB前端如何才能通过?

    从事web前端工作七年时间,因为一直是非常热爱编程的,从小就有兴趣,大学就是学计算机的,技术应该比一般同龄的都要好一些,今天我想给大家讲述一下,目前想要做web前端开发,面试成功应该如何去学习,要具备 ...

  5. web图片前端裁剪功能实现_利用html5 canvas技术实现图片裁剪

    用户上传头像然后截图的需求很常见,很多做法是把图像发送到后端,把裁剪后的结果发送给浏览器,这种方式会增加处理时延.最近正好学习了HTML5里的canvas,发现它的图片处理功能比较强大,就打算用can ...

  6. zabbix + grafana 展示

    环境CentOS 7.5 一,grafana 安装. 1,配置yum源 cat > /etc/yum.repos.d/grafana.repo <<EOF [grafana] nam ...

  7. 状压DP之炮兵阵地

    题目 原题来自:\(NOI 2001\) 司令部的将军们打算在\(N*M\) 的网格地图上部署他们的炮兵部队.一个\(N*M\)的地图由\(N\)行\(M\)列组成,地图的每一格可能是山地(用 H表示 ...

  8. 记一次实际开发过程中遇到事务报错问题 Transaction synchronization is not active

    一:问题场景 在一次http请求的后台接口中返回结果中出现了这个错误信息“Transaction synchronization is not active”,意思是“事务同步器没有激活”,但是被调用 ...

  9. Spring Boot读取配置文件的几种方式

    Spring Boot获取文件总的来说有三种方式,分别是@Value注解,@ConfigurationProperties注解和Environment接口.这三种注解可以配合着@PropertySou ...

  10. pycharm设置字体和背景色

    Pycharm字体和背景色设置 1 菜单字体大小设置 设置后: 2.编辑字体大小设置 3.背景色设置