建立TCP连接时的三次握手与四次挥手问题
1. 字段含义
1.1 状态字段
- ACK 报文是用来应答的,SYN 报文是用来同步的
- LISTEN:侦听来自远方TCP端口的连接请求
- SYN-SENT:在发送连接请求后等待匹配的连接请求
- SYN-RECETVED:在收到和发送一个连接请求后等待对连接请求的确认
- ESTABLISHED:代表一个打开的连接,数据可以传送给用户
- FIN-WAIT-1:等待远程TCP的连接中断请求,或先前的连接中断请求的确认
- FIN-WAIT-2:从远程TCP等待连接中断请求
- CLOSE-WAIT:等待从本地用户发来的连接中断请求
- CLOSING:等待远程TCP对连接中断的确认
- LAST-ACK:等待原来发向远程TCP的连接中断请求的确认
- TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
- CLOSED:没有任何连接状态
1.2 传输中的涉及字段(重点字段)
序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记
确认序号:Ack 序号,占32位,只有 ACK 标志位 为1时,确认序号字段才有效,Ack = Seq+1
标志位
- URG:紧急指针(urgent pointer)有效
- ACK:确认序号有效(用来应答的)
- SYN:发起一个新连接(用来同步的)
- PSH:接收方应该尽快将这个报文交给应用层
- RST:重置连接
- FIN:释放一个连接
注意:
不要将确认序号 Ack 与标志位中的 ACK 搞混了
确认方Ack=发起方Req+1,两端配对
2. 三次握手
2.1 原理
刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。
第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN©,此时客户端处于 SYN_SEND 状态。
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s) ,同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于SYN_RCVD 的状态。
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了链接。
2.2 作用
(1)确认双方的接受能力、发送能力是否正常。
(2)指定自己的初始化序列号,为后面的可靠传送做准备。
(3)如果是 HTTPS 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成。
2.3 涉及问题
- 为什么需要三次握手,两次不行吗?
- 第三次握手的必要性
- (ISN)是固定的吗?
- 什么是半连接队列?
- 三次握手过程中可以携带数据吗?
- 如果第三次握手丢失了,客户端服务端会如何处理?
- SYN攻击
什么是SYN攻击(SYN Flood)?如何检测SYN攻击?如何防御SYN攻击?
3. 四次挥手
3.1 原理
刚开始双方都处于 ESTABLISHED 状态,假如是客户端先发起关闭请求
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。
第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。
第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。
需要过一阵子以确保服务端收到自己的 ACK 报文之后,就处于关闭连接了,进入 CLOSED 状态。
3.2 涉及问题
- (TIME WAIT)为什么客户端发送 ACK 之后不直接关闭,而是要等一阵子才关闭?
- 挥手为什么需要四次?
- 四次挥手释放连接时,等待 2MSL 的意义?
- 为什么 TIME_WAIT 状态需要经过2MSL(最大报文段生存时间)才能返回到 CLOSE 状态?
建立TCP连接时的三次握手与四次挥手问题相关推荐
- go 监测tcp 连接断开_TCP三次握手和四次挥手以及11种状态
三次握手 置位概念:根据TCP的包头字段,存在3个重要的标识ACK.SYN.FIN ACK:表示验证字段 SYN:位数置1,表示建立TCP连接 FIN:位数置1,表示断开TCP连接 三次握手过程说明: ...
- 2022.9.07 TCP协议特点,TCP适用场合,TCP连接方式(三次握手,四次挥手)。
传输层协议: TCP <传输控制协议> transport control protocol TCP协议特点: 是一种面向连接的传输层协议,它能够提供高可靠性通信,无数据丢失,无 ...
- Python常见面试题:TCP 协议中的三次握手与四次挥手相关概念详解
今天来聊聊Python常见面试题中面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手. 涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详 ...
- 计算机网络-TCP的运输连接管理(三次握手,四次挥手)补充一下为什么不能将四次挥手改为三次挥手
hello,朋友们.今天咱们分享一下TCP连接建立与释放问题(三次握手与四次挥手问题) 1.简单介绍 基础知识了解(仅代表个人简单理解) SYN 同步(一个信号 代表自己的状态) F ...
- tcp协议报文和三次握手与四次挥手
tcp协议: tcp是面向连接.可靠的进程到进程之间的协议.tcp提供全双工服务:即:数据可在同一时间双向传输. tcp报文段首部格式: 各字段含义: 源端口号:16位字段,为发送端进程对应的端口号 ...
- 网络编程 | tcp协议 | udp协议 | 三次握手与四次挥手
目录 网络编程 为什么要用网络编程 软件开发的结构 1. C/S架构 2.B/S架构 网络基础 一个程序如何在网络上找到另一个程序? ip地址 什么是端口 远程数据传输发展史 OSI七层网络模型 前言 ...
- 【转载】万字详文彻底弄懂TCP协议:从三次握手和四次挥手说起
今日头条 腾讯技术工程 作者:morganhuang,腾讯 IEG 后台开发工程师 说到 TCP 协议,相信大家都比较熟悉了,对于 TCP 协议总能说个一二三来,但是 TCP 协议又是一个非常复杂的协 ...
- 面试必会系列 - 5.2 详解OSI模型与七层协议,网络TCP/IP基础,三次握手、四次挥手等
本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...
- 唤醒手腕 TCP/IP 协议进行三次握手、四次挥手建立连接详细介绍
访问域名的 IP 地址,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的 WEB 程序(常用的有 Apache(httpd), ngi ...
最新文章
- GStreamer 1.0 series序列示例
- centos7 各版本区别 DVD Netinstall Everything Minimal GnomeLive KdeLive
- 福师《计算机应用基础》期末考试,21年2月福师《计算机应用基础》期末考试A卷答案...
- Objective-C学习之解析XML
- web项目怎么连接云服务器,web项目怎么连接云服务器
- django的数据库名字和models.py中类名的对应关系
- html溢出自动滚动,html – 溢出-y:使用overflow-x滚动:可见
- .NET Core技术研究-主机
- linux超级工具,linux运维超级工具--sysdig
- 指令 出厂_口碑营销_南澳出口木箱出厂价
- Golang——延迟调用defer
- mysql的data文件夹的位置以及作用
- matlab2010b数值分析,matlab2010b教程
- Web前端面试 面试官常问问题
- kibana本地安装
- 盘点2019年经典营销案例
- dtls到srtp的整个流程
- 【NetCore】.NetCore之下载文件
- python显示程序运行进度_显示Python程序运行进度
- Windows驱动中的电源管理
热门文章
- ivy java_使用Ivy管理项目中的依赖
- 数据库系统概论:第十二章 数据库管理系统
- java md5包_JAVA中有没有提供MD5算法的包啊?
- 基于c#的相关性分析_基于数字高程模型的城市地貌与地名相关性分析——以兰州市为例...
- python中文对齐_Python中英文对齐终极解决方案
- Deep Learning 教程(斯坦福深度学习研究团队)
- Jmeter添加断言
- Java中console类的简单用法
- 【bzoj2754】【scoi2012】喵星球上的点名
- POJ3045 Cow Acrobats —— 思维证明