TCP三次握手详解及释放连接过程[通俗易懂]

TCP三次握手详解及释放连接过程[通俗易懂]TCP在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。两个序号和三个标志位:  (1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。  (2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。  (3)标志位:共6个,即URG、AC…

大家好,又见面了,我是你们的朋友全栈君。

TCP在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。

两个序号和三个标志位:

  (1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
  (2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
  (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
  (A)URG:紧急指针(urgent pointer)有效。
  (B)ACK:确认序号有效。
  (C)PSH:接收方应该尽快将这个报文交给应用层。
  (D)RST:重置连接。
  (E)SYN:发起一个新连接。
  (F)FIN:释放一个连接。

 需要注意的是:
  (A)不要将确认序号ack与标志位中的ACK搞混了。
  (B)确认方ack=发起方req+1,两端配对。

TCP三次握手详解及释放连接过程[通俗易懂]

在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;第二次消息B使用ack对A的数据包进行确认,

因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;

第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。

TCP三次握手详解及释放连接过程[通俗易懂]

四次挥手:

由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,

收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。

首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
 (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
 (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

TCP三次握手详解及释放连接过程[通俗易懂]

(1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。
(2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
  这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,收到对方的FIN报文时,

仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,

再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

不应该是为了防止B发送的FIN=1的包的丢失,因为如果A没有收到来自B的释放连接请求,是不会进入TIME-WAIT状态的。

所以正确的解释是:A发送的确认释放连接信息B没有收到,这时候B会再次发送一个FIN=1的释放连接请求,而这个时候A还处于TIME-WAIT,所以可以再次发送确认信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147194.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Office系列在线预览

    Office系列在线预览

    2021年8月12日
    70
  • python可以做什么

    python可以做什么python是什么?python的中文名称是蟒蛇,是一种计算机程序设计语言;是一种动态的、面向对象的脚本语言。最初是用来编写自动化脚本的,随着版本的不断更新和语言新功能的添加,越来越多被用于独立的

    2022年7月3日
    27
  • 大数据开发面试题及答案(在美团点评的开发岗怎么样)

    此面试题来自牛客网友分享的美团优选一面,面试时长一小时。网友情况:海外水本,在某三线中厂工作2年。参考答案由本公众号提供。如有错误,欢迎指正!以下为面试过程中提问,岗位为大数据开发,根据提…

    2022年4月16日
    43
  • 查看gcc版本信息和关联信息的命令[通俗易懂]

    查看gcc版本信息和关联信息的命令[通俗易懂]1、查看gccg++的版本以及其链接的信息:ls/usr/bin/gcc*-l                       ls/usr/bin/g++*-l2、如果本系统安装有多个版本的gcc,g++,想用哪个版本直接更改链接即可:首先删除原有链接:sudorm/usr/bin/gcc然后创建新的链接:sudoln–

    2022年6月26日
    56
  • spark隐式转换 toDf_隐式转换是什么

    spark隐式转换 toDf_隐式转换是什么文章目录一.生产问题背景二.隐式转换开荒2.1隐式转换函数参数RichFile2.2隐式类2.3隐式解析机制三.回归主题一.生产问题背景如上就是此blog产生的背景,SparkSQL中, DF.select()select报错不能导入 sparksqlCannotresolveoverloadedmethod’select’咨询大佬后,隐式转换的原因,导入Spark的隐式转换后即可 importspark.implicits._二.隐式转换开

    2022年10月11日
    5
  • Mysql : tinytext, text, mediumtext, longtext[通俗易懂]

    Mysql : tinytext, text, mediumtext, longtext[通俗易懂]Mysql:tinytext,text,mediumtext,longtext(2012-08-0114:26:23)转载▼标签:杂谈 分类:mysql一、数字类型类型 范围 说明 Char(N)[binary] N=1~255个字元binary:分辨大小写 固定长度 std_namecahr(32)…

    2022年8月13日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号