TCP学习笔记

news2024/12/24 8:52:17

最近面试,问TCP被问住了,感觉背八股背了印象不深刻,还是总结一些比较好。

如果有写错的,欢迎批评指正。

参考:https://www.xiaolincoding.com/network/3_tcp/tcp_interview.html#tcp-%E5%9F%BA%E6%9C%AC%E8%AE%A4%E8%AF%86

目录

  • TCP的基本概念
  • TCP的连接建立
    • 常见问题
      • 为什么要3次握手:
      • 为什么和如何产生随机序列号?
      • 丢失的处理
  • TCP的连接断开
    • TIME_WAIT是什么?起到什么作用?
      • 是什么
      • 作用
        • 防止历史连接中的数据包被错误接收。
        • 确保服务端被正确关闭

TCP的基本概念

TCP:面向连接的可靠的基于字节流传输层通信协议。

TCP连接:socket(IP和端口号)、序列号(解决乱序问题)、窗口大小(流量控制)。

唯一确定TCP连接:源地址、源端口、目标地址、目标端口。

TCP数据包包含的信息:源端口目标端口、序列号确认应答号、ACK/RST/SYN/FIN,首部长度/校验和,窗口大小。

IP层IP数据包最大长度MTU为1500字节。
除去IP和TCP头部外TCP数据的最大长度MSS。
IP层不能重传,只能在TCP层重传,如何在IP层分片,一个分片丢失所有分片都要重传。

TCP的连接建立

TCP3次握手

  1. 服务端listen进入LISTEN阶段。
  2. 第1次握手:客户端发送SYN和序列号,进入SYN_SENT阶段。
  3. 第2次握手:服务端发送SYN,以及与收到客户端SYN对应的响应ACK,进入SYN_RCVD
  4. 第3次握手:客户端发送与收到与服务端SYN对应的ACK,进入ESTABLISHED
  5. 连接成功建立:服务端收到ACK,进入ESTABLISHED

常见问题

为什么要3次握手:

  • 阻止历史连接:2次握手,服务端没有中间状态给客户端来阻止历史连接(发出但已经被客户端放弃的SYN,不是相同SYN重传),服务端为已被客户端放弃的旧SYN建立连接,进行第2次握手同时发送数据时,因序列号不符而被客户端RST,就白分配资源和发送数据了。
  • 同步双方序列号:4次可以合并为3次。
  • 避免重复连接:由于没有第三次握手,服务端不清楚客户端是否收到了自己回复的 ACK 报文,所以服务端每收到一个 SYN 就只能先主动建立一个连接

为什么和如何产生随机序列号?

很大程度上避免被延迟的历史数据报文,序列号落在窗口范围内,被错误的接收;防止黑客伪造相同序列号TCP(?)。
计时器值加连接Hash值。

丢失的处理

  1. 第1次握手:指数退避超时重传。
  2. 第2次握手:客户端重传 SYN 报文,服务端重传 SYN-ACK 报文。
  3. 第3次握手:客户端重传 SYN 报文,单独ACK不会重传。

TCP的连接断开

TCP断开4次挥手

  1. 初始时客户端和服务端TCP连接均处于 ESTAVLISHED 阶段。
  2. 客户端发送 FIN 主动断开连接,客户端进入 FIN_WAIT_1 阶段。
  3. 服务端收到 FIN ,发送 ACK ,服务端进入 CLOSED_WAIT。
  4. 客户端收到 ACK ,进入 FIN_WAIT_2 阶段。
  5. 服务端发送 FIN ,服务端进入 LAST_ACK 阶段。
  6. 客户端收到 FIN ,发送 ACK ,进入 TIME_WAIT 阶段。
  7. 服务端收到 ACK ,进入CLOSE阶段。

前两次挥手仅仅表示客户端不再发送数据了,但是还能接收数据。服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文关闭连接。
如果服务端不需要发送数据,可以变成3次挥手。

TIME_WAIT是什么?起到什么作用?

是什么

客户端在收到第3次挥手后,就会进入TIME_WAIT状态,等待 2MSL 后关闭。
如果第4次挥手未送达服务端,服务端会重发第3次挥手,客户端收到时重新计时。
MSL 是报文最大生存时间,任何报文在网络上存在的最长时间,超过时间的报文将被丢弃。
IP层有TTL,是可以经过的最大路由数,经过路由减1,为0时丢弃。MSL应大于TTL减到0的时间。
TTL一般是64,Linux中MSL是30。
2MSL是一来一回的时间上限,相当于允许第4次挥手ACK丢失后,第3次挥手FIN重发一次。

作用

防止历史连接中的数据包被错误接收。

服务端向客户端发送数据,到第3次挥手发出时截止,但之前可能存在被延迟的数据包,等待 2MSL 使数据包从网络中消失,避免当序列号回绕时被之后的相同四元组接收。

确保服务端被正确关闭

第4次挥手的ACK可能没有到达服务端,服务端重发第3次挥手FIN,在TIME_WAIT阶段会再次响应ACK,否则会响应RST。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/938089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3. 数据操作、数据预处理

3.1 N维数组 ① 机器学习用的最多的是N维数组,N维数组是机器学习和神经网络的主要数据结构。 3.2 创建数组 ① 创建数组需要:形状、数据类型、元素值。 3.3 访问元素 ① 可以根据切片,或者间隔步长访问元素。 ② [::3,::2]是每隔3行、2列…

WebGL uniform变量、gl.getUniformLocation、gl.uniform4f及其同族函数相关介绍

目录 uniform变量命名规范 获取 uniform 变量的存储地址 gl.getUniformLocation 向uniform变量赋值 gl.uniform4f ​编辑 gl.uniform4f()的同族函数 demo:点击webgl坐标系的四个象限绘制各自不同颜色的点 uniform变量命名规范 var FSHADER_SOURCE uniform vec4…

pandas由入门到精通-数据清洗-扩展数据类型

pandas-02-数据清洗&预处理 扩展数据类型1. 传统数据类型缺点2. 扩展的数据类型3. 如何转换类型文中用S代指Series,用Df代指DataFrame 数据清洗是处理大型复杂情况数据必不可少的步骤,这里总结一些数据清洗的常用方法:包括缺失值、重复值、异常值处理,数据类型统计,分…

深入URP之Shader篇14: GPU Instancing

GPU Instancing 必须是同一个模型,材质也必须相同,但材质的参数可以不同(使用MaterialPropertyBlock指定),然后基于一个Instanced Draw Call,一次性绘制多个模型。 参考:https://docs.unity3d.…

整合SSM:Mybatis层

SSM(SpringSpringMVCMyBatis)框架集由Spring、MyBatis两个开源框架整合而成.为了加深记忆学习,也为了后续资源方便使用.所以决定就对SSM做一个整合,首先是Mybatis层。 思路: 1.开发环境 基本环境: IDEA MySQL 8.0.22 Tomcat 9…

java实现生成RSA公私钥、SHA256withRSA加密以及验证工具类

前言: RSA属于非对称加密。所谓非对称加密,需要两个密钥:公钥 (publickey) 和私钥 (privatekey)。公钥和私钥是一对,如果用公钥对数据加密,那么只能用对应的私钥解密。如果用私钥对数据加密,只能用对应的公…

android系统启动流程之zygote(Native)启动分析

zygote有一部分运行在native,有一部分运行在java层,它是第一个进入java层的进程 zygote在启动时,在init.${ro.zygote}.rc脚本中,里面描述了zygote是如何被启动的, 当init进程解析到zygote.rc文件时,将根据解析出来的命…

蓝桥杯数论必考算法------快速幂

快速幂 目录 快速幂一.暴力解法 O(n∗b) 会TLE二.快速幂解法 O(n∗logb)2.1快速幂之迭代版 O(n∗logb)2.2快速幂之递归版 O(n∗logb) 三&#xff1a;快速幂练习(快速幂求逆元) 一.暴力解法 O(n∗b) 会TLE #include<iostream> using namespace std; int main() {int n;cin…

Matlab图像处理-减法运算

减法运算 图像减法也称为差分方法&#xff0c;是一种常用于检测图像变化及运动物体的图像处理方法。常用来检测一系列相同场景图像的差异&#xff0c;其主要的应用在于检测同一场景下两幅图像之间的变化或是混合图像的分离。 差影法 将同一景物在不同时问拍摄的图像或同一景…

飞腾E2000从eMMC或SD启动U-boot和系统

本文讲解了,如何设置uboot环境变量和编译linux内核,实现将uboot和系统同时放置到SD卡或eMMC后,从SD或者eMMC启动uboot,引导系统启动的过程。 同时使用E2000Q-demo,演示了从SD卡启动和从eMMC启动的过程。 1、制作MMC(eMMC/SD卡)启动镜像文件 1.1、重新编译u-boot.bin,…

印花税减半!上次调整A股全部涨停

财政部、税务总局公告&#xff0c;为活跃资本市场、提振投资者信心&#xff0c;自2023年8月28日起&#xff0c;证券交易印花税实施减半征收。 值得一提的是&#xff0c;8月初&#xff0c;证券时报、经济日报、央广网等三大官媒共同发声&#xff0c;为活跃资本市场、提振投资者信…

慢SQL调优第一弹——更新中

基础知识 Explain性能分析 通过explain我们可以获得以下信息&#xff1a; 表的读取顺序 数据读取操作的操作类型 哪些索引可以被使用 哪些索引真正被使用 表的直接引用 每张表的有多少行被优化器查询了 1&#xff09;ID字段说明 select查询的序列号&#xff0c;包含一组数…

Matlab之统计一维数组直方图 bin 计数函数histcounts

一、语法 [N,edges] histcounts(X) [N,edges] histcounts(X,nbins) [N,edges] histcounts(X,edges) 解释&#xff1a; 1.1 [N,edges] histcounts(X) 将 X 的值划分为多个 bin&#xff0c;并返回每个 bin 中的计数以及 bin 边界。histcounts 函数使用自动分 bin 算法&am…

Visual Studio编译出来的程序无法在其它电脑上运行

在其它电脑&#xff08;比如Windows Server 2012&#xff09;上运行Visual Studio编译出来的应用程序&#xff0c;结果报错&#xff1a;“无法启动此程序&#xff0c;因为计算机中丢失VCRUNTIME140.dll。尝试重新安装该程序以解决此问题。” 解决方法&#xff1a; 属性 -> …

python实例方法,类方法和静态方法区别

为python中的装饰器 实例方法 实例方法时直接定义在类中的函数&#xff0c;不需要任何修饰。只能通过类的实例化对象来调用。不能通过类名来调用。 类方法 类方法&#xff0c;是类中使用classmethod修饰的函数。类方法在定义的时候需要有表示类对象的参数(一般命名为cls&#…

春秋云镜 CVE-2019-12422

春秋云镜 CVE-2019-12422 Shiro < 1.4.2 cookie oracle padding漏洞 靶标介绍 Apache Shiro是美国阿帕奇&#xff08;Apache&#xff09;软件基金会的一套用于执行认证、授权、加密和会话管理的Java安全框架。 Apache Shiro 1.4.2之前版本中存在安全漏洞。当Apache Shiro使…

BM80 买卖股票的最好时机(一)

目录 1.题目描述 2.题目分析 3.编写代码 4.总结 这是牛客网上的一道题目 1.题目描述 题目链接&#xff1a;买卖股票的最好时机(一)_牛客题霸_牛客网 (nowcoder.com) 2.题目分析 我们看到这个题目中一个数组表示每一天的股价&#xff0c;那么最大利润怎么算呢&#xff0c…

《入门级-Cocos2dx4.0 塔防游戏开发》---第七课:游戏界面开发(自定义Layer)

目录 一、开发环境 二、开发内容 2.1 添加资源文件 2.2 游戏MenuLayer开发 2.3 GameLayer开发 三、演示效果 四、知识点 4.1 sprite、layer、scene区别 4.2 setAnchorPoint 一、开发环境 操作系统&#xff1a;UOS1060专业版本。 cocos2dx:版本4.0 环境搭建教程&…

【核磁共振成像】部分傅里叶重建

目录 一、部分傅里叶重建二、部分傅里叶重建算法2.1 填零2.2 零差处理 一、部分傅里叶重建 在部分傅里叶采集中&#xff0c;数据并不是绕K空间中心对称收集的&#xff0c;而是K空间的一半是完全填充的&#xff0c;另一半只收集了一小部分数据。   部分傅里叶采集所依据的原理…

bindService的调用流程

使用bindService去调用service&#xff0c;如果有多个客户端调用&#xff0c;onBind方法只会被调用一次&#xff0c;由于bindService嗲处理中&#xff0c;AMS是一个中间商&#xff0c;猜测这个处理也是AMS里进行的&#xff0c;这里我们再看看bindService的调用流程 public clas…