三次握手与四次挥手

通过TCP/IP协议的学习,我们可以知道TCP协议是一种面向连接的、可靠的传输协议。其中,为了保证客户端与服务器连接的有效性,就有了本篇文章所要介绍的“三次挥手”;而“四次挥手”则是为了保证连接的正确断开。

1. TCP状态

首先,介绍一下TCP的几个状态:

  • SYN —— 同步序列编号,在建立连接时发送
  • ACK —— 确认信息,在确认SYN信息时发送,响应信息
  • FIN —— 关闭连接
  • RST —— 连接重置
  • PSH —— 有数据传输
  • URG —— 紧急指针字段值有效

2. 三次握手

建立TCP连接时会经过如下步骤:

  • 服务器准备接收客户端连接(通过socket API),由于连接是由客户端激发的,因此称为被动打开
  • 客户端调用connect开始主动打开,并发送SYN(syn = i)包,告诉服务器发送数据的序列号
  • 服务器确认(ACK,ack = i+1)客户端发来的信息(SYN),并发送SYN(syn = j),其中含有服务器发送数据的初始序列号。注:SYNACK是同时发送的,在一个数据包中
  • 客户端确认服务器发送的SYN,发送ACK(ack = j+1)数据包

其中,因为SYN需要占据一个字节的序列号空间,因此ACK中确认号为发来的SYN序列号加1;类似,FIN的ACK确认号为该FIN序列号加1。

3. 四次挥手

  • 某进程先调用close,该端TCP发送FIN(fin = i),表示数据发送完毕,需要关闭连接。称为主动关闭
  • 接收到FIN的对端执行被动关闭。进行确认(ACK, ack = i+1),在该进程接收的其他所有数据之后添加文件结束符(end-of-file)
  • 一段时间之后(因为要处理已经接收到的数据),接收到文件结束符的进程调用close关闭套接字,这导致它的TCP也发送FIN(fin = j)
  • 主动关闭连接的一端确认(ACK, ack = j+1)最后发送的FIN

为什么建立连接要三次握手,而断开连接要四次挥手?

建立连接时,因为发起连接的一端在发出请求后,连接建立之前,就不会再发出任何数据,因此接收连接请求的对端可以将ACK、SYN放在一个数据包里发回给请求端,即需要三次数据发送。而断开连接时,在一端主动断开连接并发送FIN包后,对端接收到发来的FIN包,进行确认(ACK),然而此时服务器可能还在给另一端发送数据,只有在数据发送完后才能断开连接,发送FIN包(所以不能像三次握手时那样将ACK、SYN同时发送),另一端收到FIN后再进行确认并发送ACK,因此需要四次数据发送。

TCP建立的连接为全双工通道,可以双向传输数据,因此在建立连接、断开连接时,需要两端都要进行请求与确认。

为什么建立连接的ACK、SYN可以同时发送,而断开连接则需要分开发送?

建立、断开连接都需要两次请求与确认,只是建立连接时SYN、ACK可以同时发回,而在断开连接时,由于被动关闭的一端可能还会发送数据,只有数据发完后才能发送ACK,所以只能分开发送,也就造成了建立连接为三次,断开连接反而成了四次。(建立连接时由于握手期间连接未完全建立,故不能发送其他数据)


简单说,由于分组交换机制,由A发给B的数据所经过的链路可能与B返回给A的数据所经过的链路不同,因此即便在B接收到A的数据并返回给A应答后,仅能保证A-->B的链路是通的,却不能保证A一定可以接收到B的应答,因此需要A再给B一个应答来确保链路两端都收到了相应的数据。

【计算机网络】三次握手与四次挥手相关推荐

  1. 计算机网络 - 三次握手,四次挥手

    目录 1.  TCP的封装格式 2.   三次握手 3.  四次挥手 1.  TCP的封装格式 端口号的范围:2^16=65536 1~65536 ->有些端口号已经分配给了经典服务了,或者系统 ...

  2. 计算机网络【UDP与TCP协议(三次握手、四次挥手)】

    计算机网络[UDP与TCP协议(三次握手.四次挥手)]

  3. 【重难点】【计算机网络 02】TCP 和 UDP 的区别、TCP 的三次握手和四次挥手、HTTP 和 HTTPS、HTTP 各版本之间的区别、HTTP 如何实现长连接

    [重难点][计算机网络 02]TCP 和 UDP 的区别.TCP 的三次握手和四次挥手.HTTP 和 HTTPS.HTTP 各版本之间的区别.HTTP 如何实现长连接 文章目录 [重难点][计算机网络 ...

  4. 计算机网络学习笔记(七)——传输层、TCP三次握手、四次挥手、TCP流量控制、大总结

    文章目录 前言 概念 一.传输层概述 二.传输层问题 三.端到端寻址 四.TCP三次握手和四次挥手 (一)三次握手建立连接 (二)四次挥手拆除连接 五.带拥塞的TCP流量控制 六.传输层实例 计网大总 ...

  5. 【计算机网络面试】tcp/ip协议三次握手、四次挥手

    TCP报文格式 TCP 报文是 TCP 层传输的数据单元,也称为报文段.TCP 报文中每个字段如图所示. 上图中 TCP 报文中每个字段的含义如下: 源端口和目的端口字段 TCP源端口(Source ...

  6. 计算机网络-TCP的运输连接管理(三次握手,四次挥手)补充一下为什么不能将四次挥手改为三次挥手

    hello,朋友们.今天咱们分享一下TCP连接建立与释放问题(三次握手与四次挥手问题) 1.简单介绍 基础知识了解(仅代表个人简单理解) SYN        同步(一个信号   代表自己的状态) F ...

  7. 硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

    来自:小林coding 每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 T ...

  8. 为什么有TCP 的三次握手 和 四次挥手

    由于我们的设备上的通信程序很直接,所以当时没有仔细想过TCP的三次握手和四次挥手这个问题,有的时候自己写的时候 会忘掉这个问题,就是为什么会有三次握手的过程和4次挥手的过程 简单来说就一句话 &quo ...

  9. TCP 三次握手 和 四次挥手

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

最新文章

  1. squid,nginx,lighttpd反向代理的区别
  2. 【对讲机的那点事】公网对讲机选择物联网卡常见问题
  3. 计算机中字长名词解释,《计算机科学概论》复习题(内含参考答案)
  4. python使用sql读取数据表并返回dataframe
  5. 4.5_abstract_factory_创建型模式:抽象工厂模式
  6. 白话容器namespace
  7. C++ 鼠标乱动整人代码
  8. 计算机u启动无法识别,电脑不识别u盘启动盘
  9. odoo报表内部和外部布局
  10. 文本分类特征提取之Word2Vec
  11. 招生报名小程序开发笔记二:功能需求设计
  12. 手机识别图片文字的方法
  13. [AI]A*搜索练习题——3传教士3食人族、单臂机器人、汉诺塔
  14. 99%的人都不知道的减肥小秘密,你必须知道
  15. 生育指南(写给临产准妈妈)
  16. Google Authenticator 原理及Java实现
  17. Python中complex复数类型的简单介绍
  18. chatGPT Access denied访问被拒绝(已解决)
  19. 读书笔记:《SEO教程:搜索引擎优化入门与进阶》(4)——代码优化
  20. 【渝粤教育】国家开放大学2018年春季 0195-21T机械设计基础 参考试题

热门文章

  1. 课时2.浏览器和服务器(了解)
  2. 138.括号序列(区间型DP)
  3. idhttp.post方式 调用datasnap rest 远程方法
  4. Java 注解学习笔记
  5. 【第二届】Erlang Fans交流会(补充事宜)
  6. android根据mac地址连接耳机,Android获取设备IMEI和Mac地址
  7. java创建方法并引用_java – 创建非捕获方法引用,它将调用超类方法
  8. 连接mysql超时时间设置多少_怎么设置数据库的连接数和连接超时时间
  9. django异常日志_【python小随笔】Django+错误日志(配置Django报错文件指定位置)...
  10. cgcs2000大地坐标系地图_为什么要从北京54和西安80统一到CGCS2000?测绘人必知!...