TCP的三次握手与四次挥手理解及面试题

2023-10-29

   

     序列号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 提示接收端应用程序立即从TCP缓冲区把数据读走。
RST
 
对方要求重新建立连接,复位。
SYN
 
请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1
FIN 希望断开连接。

三次握手过程理解

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

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

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

 

四次挥手过程理解 

  1. 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  2. 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
  3. 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
  4. 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
  5. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
  6. 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

 

 

 常见面试题

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

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

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

【问题3】为什么不能用两次握手进行连接?

答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。

       现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。


转自:https://blog.csdn.net/qq_38950316/article/details/81087809 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP的三次握手与四次挥手理解及面试题 的相关文章

  • 计算机网络(二):TCP篇

    文章目录 1 TCP头部包含哪些内容 2 为什么需要 TCP 协议 TCP 工作在哪一层 3 什么是 TCP 4 什么是 TCP 连接 5 如何唯一确定一个 TCP 连接呢 6 UDP头部大小是多少 包含哪些内容 7 TCP与UDP的区别
  • python TCP通信雷达实时解析数据

    雷达解析程序 coding cp936 import socket import re class jiema def yushe3 self receve r receve av receve v receve h while True
  • Google的TCP BBR拥塞控制算法深度解析

    原作者 dog250 授权发布 重新整理 极客重生 hi 大家好 今天推荐一篇我认为在TCP BBR技术里面分析非常透彻的文章 希望大家可以学习到一些真正的知识 理解其背后的设计原理 才能应对各种面试和工作挑战 宏观背景下的BBR 1980
  • 爬虫的代理IP池写哪里了?

    亲爱的程序员小伙伴们 想要提高爬虫效率和稳定性 组建一个强大的代理IP池是非常重要的一步 今天我就来和你分享一下 代理IP池到底应该写在哪里 以及如何打造一个令人瞩目的代理IP池 准备好了吗 一起看看吧 一 代理IP池的代码位置选择 1 写
  • 端口扫描工具-Nmap

    Nmap是一款功能强大 功能丰富的网络扫描工具 对于网络管理员和安全专业人员来说 是一个非常有用的工具 并且被广泛应用于安全审计 网络调查 漏洞搜寻等领域 能扫描主机的端口 查看端口是否开放 端口的服务是什么 端口扫描不但可以为黑客所利用
  • 【Unix 网络编程】TCP状态转换图详解

    在前面 已经介绍了TCP协议的三路握手和四次挥手 如下图所示 TCP通信过程包括三个步骤 建立TCP连接通道 三次握手 数据传输 断开TCP连接通道 四次挥手 这里进一步探究TCP三路握手和四次挥手过程中的状态变迁以及数据传输过程 先看TC
  • read tcp 192.168.0.106:56298->185.199.111.153:80: wsarecv: An existing connection was forcibly close

    解决 read tcp 192 168 0 106 56298 gt 185 199 111 153 80 wsarecv An existing connection was forcibly close 问题 问题描述 问题原因 解决办
  • TCP快速重传机制

    一 快速重传机制 上一篇讲到了TCP 的超时重传 但是超时重传往往会带来许多微妙的问题 比如说 当一个报文段丢失时 会等待一定的超时周期然后才重传分组 增加了端到端的时延 当一个报文段丢失时 在其等待超时的过程中 可能会出现这种情况 其后的
  • OSI七层模型和TCP/IP五层模型

    一 OSI七层模型 七层模型从下往上依次为物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 各层功能如图所示 应用层 与其它计算机进行通讯的一个应用 它是对应应用程序的通信服务的 例如 一个没有通信功能的自处理程序就不能执行通信的
  • 如何快速检测代理IP质量?方法与工具全干货

    一直以来 IP代理都是出海跨境业务的刚需 质量好的IP代理 除了在跨境业务产生巨大作用 在SEO监控 爬虫抓取 市场研究等领域也发挥着很大的作用 但是 对于IP代理的质量检测是我们选择高标准IP代理的一句 我们一般都会建议在使用IP代理前
  • 给windows宿主机和wsl2的ubuntu-20.04分配固定IP,使能相互ping通

    我们知道wsl2是基于hyper v的虚拟机 每次重新启动的时候 都会重新拉一个新的hyper v虚拟机实例 然后虚拟网卡的IP是dhcp随机分配的 如果作为开发系统用 就会比较烦每次都要换一个IP 有人提供了个脚本 他写了个bat脚本在w
  • 在外远程登录局域网下的象过河ERP管理系统,无需公网IP

    文章目录 概述 1 查看象过河服务端端口 2 内网穿透 3 异地公网连接 4 固定公网地址 4 1 保留一个固定TCP地址 4 2 配置固定TCP地址 5 使用固定地址连接 转发自CSDN远程穿透的文章 公网远程访问公司内网象过河ERP系统
  • DHCP的配置(以华为eNSP为例)

    如有错误 敬请谅解 此文章仅为本人学习笔记 仅供参考 如有冒犯 请联系作者删除 基础知识介绍 络组建步骤 1 拓扑设计 2 IP地址规划 按照拓扑中划分的 络范围 规划 络位不同的IP地址 3 配置 1 配置各个节点的IP地址 2 路由 全
  • Linux TCP链接查看和调整

    查看Linux的TCP连接数的方法如下 统计80端口连接数 netstat nat grep i 80 wc l 统计httpd协议连接数 ps ef grep httpd wc l 统计已连接上的 状态为 established 的TCP
  • 通讯编程001——Nodejs快速开发Modbus TCP Master

    本文介绍如何利用ModbusJs库快速开发Modbus TCP Master 相关源码请登录网信数智 wangxinzhihui com 下载 ModbusJs是一个基于Nodejs的Modbus TCP的开发库 目前支持的功能函数有 re
  • 网络安全与IP安全网络安全

    网络安全 是指网络系统的硬件 软件以及系统中的数据收到的保护 保护的基本属性为 机密性 身份认证 完整性和可用性 基本特征 相对性 时效性 相关性 不确定性 复杂性和重要性 在该方向主要研究如下领域 入侵者如何攻击网络 如何防护网络对抗攻击
  • 无需公网IP!Apache服务器本地部署与内网穿透实现公网访问

    Apache服务安装配置与结合内网穿透实现公网访问 文章目录 Apache服务安装配置与结合内网穿透实现公网访问 前言 1 Apache服务安装配置 1 1 进入官网下载安装包 1 2 Apache服务配置
  • AUTOSAR从入门到精通-面向服务的中间件SOME/IP(二)

    目录 前言 几个高频面试题目 基于信号的通信和面向服务的通信特点和差异
  • C# Tcplistener,Tcp服务端简易封装

    文章目录 前言 相关文章 前言 设计 代码 简单使用 运行结果 前言 我最近有个需求要写Tcp服务端 我发现Tcp服务端的回调函数比较麻烦 简化Tcp的服务 我打算自己封装一个简单的Tcp服务端 相关文章 C TCP应用编程三 异步TCP应
  • 搞懂 三次握手四次挥手

    计算机网络体系结构 在学习TCP 三次握手四次挥手之前 让我们先来看下计算机网络分层 主要分为OSI模型和TCP IP模型 OSI模型比较复杂且学术化 所以我们实际使用的TCP IP模型 以连接Mysql服务器为例理解这五层 应用层 应用层

随机推荐

  • 基于MMDetection训练VOC格式数据集

    一 环境说明 基于前述安装MMDetection 数据集为VOC格式 主要版本如下 Python 3 7 8 CUDA 11 3 cuDNN 8 4 0 torch 1 12 0 torchvision 0 13 0 mmcv full 1
  • js逆向之猿人学-反混淆刷题平台第十八题(jsvmp)

    链接 第十八题 jsvmp 洞察先机 猿人学 内容分析 题目要求 抓取这5页的数字 计算加和并提交结果 接口分析 F12 点击第二页 这里我们能看到有三个请求参数 page t v 一看就能知道 page 页码 t 时间戳 v 加密参数 所
  • python编写字典爆破网站登录

    在做渗透时 因为太菜了 不会用网上的爆破工具 自己就即兴写了一个简单的字典爆破 新手小白可以借鉴思路 就当学习了 大佬请绕道 如果有好用的爆破工具 欢迎大佬推荐 方便理解 我简单说一下背景 渗透的是某靶机的网站 该靶机只用输入正确密码就能成
  • python idle 清屏

    使用 python idle 写代码时 写满屏幕后 总想清屏一下 类似Windows dos窗口的 cls 命令 百度查到好多种方法 经过测试 发现均不好用 本人使用版本为 2 7 8 1 在shell中输入 import os os sy
  • C++枚举类型用法总结(enum)(可以用枚举字符常量代替常量)

    C 枚举类型enum表示枚举 通常用于定义个新类型的字符常量 比如enum January February March 枚举类型的作用域一般是整个文件或者类内 当枚举类型定义在文件开头时 则作用域是从定义位置开始往后 不包括函数内定义 当
  • 《Keras深度学习:入门、实战与进阶》之印第安人糖尿病诊断

    本文摘自 Keras深度学习 入门 实战与进阶 1 数据理解 本节使用Pima Indians糖尿病发病情况数据集 该数据集最初来自国家糖尿病 消化 肾脏疾病研究所 数据集的目标是基于数据集中包含的某些诊断测量来诊断性的预测患者是否患有糖尿
  • c++基于Resnet(Dlib库)+opencv3的高精度人脸识别

    Resnet 产生原因 介绍残差网络Resnet之前 先介绍一下卷积神经网络过程中会遇到的问题 分别有 计算资源的消耗 模型容易过拟合 梯度消失 梯度爆炸问题的产生 问题1可以通过GPU集群来解决 对于一个企业资源并不是很大的问题 问题2的
  • Latex作者右上角ORCID图标的引入以及取消参考文献绿框的方法

    前言 如何在Latex编写过程中直接在作者栏右上角添加ORCID的标识 如下图所示 首先需要引入两个包 usepackage orcidlink usepackage tikz 以李四的ORCID为0000 0001 1234 1234为例
  • pipeline入门

    1 什么是pipeline 在jenkins官方文档是这样介绍pipeline的 https www jenkins io zh doc pipeline是一套jenkins官方提供的插件 它可以用来在jenkins中实现和集成连续交付 p
  • 网络工程师常见面试题,1分钟就能看完

    哈喽大家好 我是网工学姐 今天我们继续来看看网络工程师在面试中的一些常见问题 后续也会持续更新 大家可以收藏起来慢慢看哦 面试官 请说一下什么是TCP 参考答案 TCP 是TCP IP四层模型中的传输层协议 中文名称是传输控制协议 它是一个
  • win10无法访问共享服务器的文件夹,win10系统无法访问共享文件夹提示网络错误的解决方法...

    win10系统想必大家都非常熟悉吧 然而有时候可能会碰到win10系统无法访问共享文件夹提示网络错误的情况 想必大家都遇到过win10系统无法访问共享文件夹提示网络错误的情况吧 那么应该怎么处理win10系统无法访问共享文件夹提示网络错误呢
  • 拯救小鸡

    问题 B 拯救小鸡 时间限制 1 Sec 内存限制 128 MB 提交 91 解决 44 提交 状态 讨论版 题目描述 鸡国最近遇到了一件很棘手的事情 经常有一只老鹰想来抓小鸡 经鸡国情报员探查 这只老鹰打算共来袭击 n 次 第 i 次来的
  • Vue的概念

    一 vue的基本概念 Vue 读音是 vju 是一套用于构建用户界面的渐进式框架 自底层向上应用 Vue的核心库只关注视图层 容易入门 可以和第三方库或者已有的项目进行整合 可以做复杂的单页应用 简单的说 vue是一套前端的开发框架 vue
  • react-document-title单页应用改变title

    原文地址 在使用react框架开发单页应用时 通常会遇到页面跳转但不知要如何去改变document title页面标题的情况 react document title插件较为完美的帮助我们解决了这一问题 npm文档链接 官方介绍 react
  • OpenCV - 车牌识别新手入门级讲解

    目录 0 引言 1 MFC中的车牌显示 2 车牌定位 3 字符提取 4 文字识别 5 文字预测 0 引言 第一次使用OpenCV完成一个完整的功能 有所收获 特此记录 这篇博客中的车牌识别功能比较简单 只能识别一般的蓝色车牌 只能识别拍摄较
  • Python中数据处理(npz、npy、csv文件;元组、列表、numpy数组的使用)

    目录 1 npz文件 2 npy文件 3 csv文件 4 列表 元组 numpy矩阵 列表 元组 不可变列表 Numpy数组 Numpy矩阵 1 npz文件 npz是python的压缩文件 读取文件 独取文件 读取当前文件夹下的data的m
  • jdk11配置javafx

    下载javafx的jar包 网站 https openjfx io 进去之后直接点下载 下载对应操作系统的版本 这里下载windows系统的 下载完之后是一个压缩包文件 解压 刚开始写好之后是这样的 找不到javafx的类 接下来导入jar
  • [机器学习与scikit-learn-37]:算法-分类-支持向量机-核函数与线性不可分-原理

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123804551 目录 前言 第1章
  • junit测试案例

    JUnit测试是以Java写成的 使用Java测试Java软件形成一个介于测试及程序代码间的无缝 seamless 边界 在测试的控制下测试变成整个软件的扩充同时程序代码可以被重整 Java编译器的单元测试静态语法检查可已帮助测试程序并且确
  • TCP的三次握手与四次挥手理解及面试题

    序列号seq 占4个字节 用来标记数据段的顺序 TCP把连接中发送的所有数据字节都编上一个序号 第一个字节的编号由本地随机产生 给字节编上序号后 就给每一个报文段指派一个序号 序列号seq就是这个报文段中的第一个字节的数据编号 确认号ack