【计算机网络】三次握手与四次挥手
三次握手与四次挥手
通过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)
,其中含有服务器发送数据的初始序列号。注:SYN
和ACK
是同时发送的,在一个数据包中 - 客户端确认服务器发送的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. TCP的封装格式 2. 三次握手 3. 四次挥手 1. TCP的封装格式 端口号的范围:2^16=65536 1~65536 ->有些端口号已经分配给了经典服务了,或者系统 ...
- 计算机网络【UDP与TCP协议(三次握手、四次挥手)】
计算机网络[UDP与TCP协议(三次握手.四次挥手)]
- 【重难点】【计算机网络 02】TCP 和 UDP 的区别、TCP 的三次握手和四次挥手、HTTP 和 HTTPS、HTTP 各版本之间的区别、HTTP 如何实现长连接
[重难点][计算机网络 02]TCP 和 UDP 的区别.TCP 的三次握手和四次挥手.HTTP 和 HTTPS.HTTP 各版本之间的区别.HTTP 如何实现长连接 文章目录 [重难点][计算机网络 ...
- 计算机网络学习笔记(七)——传输层、TCP三次握手、四次挥手、TCP流量控制、大总结
文章目录 前言 概念 一.传输层概述 二.传输层问题 三.端到端寻址 四.TCP三次握手和四次挥手 (一)三次握手建立连接 (二)四次挥手拆除连接 五.带拥塞的TCP流量控制 六.传输层实例 计网大总 ...
- 【计算机网络面试】tcp/ip协议三次握手、四次挥手
TCP报文格式 TCP 报文是 TCP 层传输的数据单元,也称为报文段.TCP 报文中每个字段如图所示. 上图中 TCP 报文中每个字段的含义如下: 源端口和目的端口字段 TCP源端口(Source ...
- 计算机网络-TCP的运输连接管理(三次握手,四次挥手)补充一下为什么不能将四次挥手改为三次挥手
hello,朋友们.今天咱们分享一下TCP连接建立与释放问题(三次握手与四次挥手问题) 1.简单介绍 基础知识了解(仅代表个人简单理解) SYN 同步(一个信号 代表自己的状态) F ...
- 硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
来自:小林coding 每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 T ...
- 为什么有TCP 的三次握手 和 四次挥手
由于我们的设备上的通信程序很直接,所以当时没有仔细想过TCP的三次握手和四次挥手这个问题,有的时候自己写的时候 会忘掉这个问题,就是为什么会有三次握手的过程和4次挥手的过程 简单来说就一句话 &quo ...
- TCP 三次握手 和 四次挥手
概述 我们都知道 TCP 是 可靠的数据传输协议,UDP是不可靠传输,那么TCP它是怎么保证可靠传输的呢?那我们就不得不提 TCP 的三次握手和四次挥手. 三次握手 下图为三次握手的流程图 下面通过我 ...
最新文章
- squid,nginx,lighttpd反向代理的区别
- 【对讲机的那点事】公网对讲机选择物联网卡常见问题
- 计算机中字长名词解释,《计算机科学概论》复习题(内含参考答案)
- python使用sql读取数据表并返回dataframe
- 4.5_abstract_factory_创建型模式:抽象工厂模式
- 白话容器namespace
- C++ 鼠标乱动整人代码
- 计算机u启动无法识别,电脑不识别u盘启动盘
- odoo报表内部和外部布局
- 文本分类特征提取之Word2Vec
- 招生报名小程序开发笔记二:功能需求设计
- 手机识别图片文字的方法
- [AI]A*搜索练习题——3传教士3食人族、单臂机器人、汉诺塔
- 99%的人都不知道的减肥小秘密,你必须知道
- 生育指南(写给临产准妈妈)
- Google Authenticator 原理及Java实现
- Python中complex复数类型的简单介绍
- chatGPT Access denied访问被拒绝(已解决)
- 读书笔记:《SEO教程:搜索引擎优化入门与进阶》(4)——代码优化
- 【渝粤教育】国家开放大学2018年春季 0195-21T机械设计基础 参考试题
热门文章
- 课时2.浏览器和服务器(了解)
- 138.括号序列(区间型DP)
- idhttp.post方式 调用datasnap rest 远程方法
- Java 注解学习笔记
- 【第二届】Erlang Fans交流会(补充事宜)
- android根据mac地址连接耳机,Android获取设备IMEI和Mac地址
- java创建方法并引用_java – 创建非捕获方法引用,它将调用超类方法
- 连接mysql超时时间设置多少_怎么设置数据库的连接数和连接超时时间
- django异常日志_【python小随笔】Django+错误日志(配置Django报错文件指定位置)...
- cgcs2000大地坐标系地图_为什么要从北京54和西安80统一到CGCS2000?测绘人必知!...