TCP学习笔记

最近面试,问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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qt在线包下载安装出错 无法检索远程树

我的问题好像是在安装Qt5.15.2出现的。 我的情况是由于网络问题问题,设置开启了本机的代理之后,就可以正常下载了。

Java小游戏

一、需求 二、思路一 HP当然是怪物的一个属性成员,而武器是角色的一个属性成员,类型可以使字符串,用于描述目前角色所装备的武器。角色类有一个攻击方法,以被攻击怪物为参数,当实施一次攻击时,攻击方法被调…

C++设计模式之适配器模式

一、适配器模式 适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成另一个类所期望的接口,以便两个类能够协同工作。 适配器模式可以解决现有类接口与所需接口不匹配的问题,使得原本因接口不…

BlazorServer中C#与JavaScript的相互调用

BlazorServer中C#与JavaScript的相互调用 前言: ​ 虽然BlazorServer中推荐使用C#在razor页面中的替代JavaScript来完成逻辑的编写,但当需要使用第三方的javascript文件/组件里的内容时,则难免要在C#中调用其方法或对象。反之当你的(用到第…

湖北咸宁农业三维扫描数字化农业3d打印制造应用-CASAIM中科广电

农业是人类衣食之源、生存之本,是一切生产的首要条件,CASAIM在农业三维扫描和3d打印应用上有丰富经验。 1.三维扫描技术在农业领域的应用 CASAIM三维扫描是集光学、机电和计算机技术于一体的高新无损检测技术,能够对实物的空间外形、结构乃…

Redis数据结构全解析【万字详解】

文章目录 前言一、SDS1、SDS的必要性2、SDS的数据结构3、SDS的优势O(1)复杂度获取字符串长度二进制安全不会发生缓冲区溢出节省空间 二、链表1、结构设计2、优缺点 三、压缩列表1、结构设计2、连续更新3、压缩列表的缺陷 四、哈希表1、结构设计2、哈希冲…

ubuntu安装goland

下载并解压goland sudo tar -C /opt/ -xzvf goland-2023.1.3.tar.gz配置应用图标 新建文件: vim /usr/share/applications/goland.desktop文件中写入如下内容: [Desktop Entry] TypeApplication NameGoLand Icon/opt/GoLand/bin/goland.png Exec/op…

科技赋能,教育革新——大步迈向体育强国梦

在 "全民健身"、"体育强国建设"战略的推进下,体育考试成绩被纳入重要升学考试且分值不断提高,体育科目的地位逐步上升到前所未有的高度,在此趋势下,体育教学正演变出更多元化、个性化的需求。然而现实中却面临…

centos7安装MySQL8

Centos7安装MySQL8 MySQL版本:8.0.34 1.安装前准备 (1)查看是否安装mariadb [rootkb135 ~]# rpm -qa|grep mariadb (2)卸载mariadb并检查是否卸干净 [rootkb135 ~]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x8…

【C语言】2023.8.27C语言入学考试复盘总结

前言 本篇文章记录的是对于2023年8月27日的 C语言 的入学考试的整理总结 成绩:220/240 题目:9/12 错题整理 首先先对于我没做出来的三道题做一个整理 错题1:7-4 分段函数PLUS 题干 以下是一个二元分段函数,请你根据所给的函…

SketchBook软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 SketchBook是一款由Autodesk公司开发的绘画和绘图软件,它适用于各种操作系统和平台,如Windows、macOS、iOS和Android等。 SketchBook是一款专业的绘图软件,旨在满足各种绘画和绘图需求。它提…

TensorBoard的使用

TensorBoard:对图像进行变换 1. SummaryWriter的使用 ctrl类出现注释解析: 将条目直接log_dir写入要成为由TensorBoard使用。 “摘要编写器”类提供了一个高级 API 来创建事件文件,并在给定目录中添加摘要和事件。该类更新文件内容异步。…

如何配置一个永久固定的公网TCP地址来SSH远程树莓派?

文章目录 如何配置一个永久固定的公网TCP地址来SSH远程树莓派?前置条件命令行使用举例:修改cpolar配置文件 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 …

【Apollo学习笔记】——规划模块TASK之PATH_REUSE_DECIDER

文章目录 前言PATH_REUSE_DECIDER功能简介PATH_REUSE_DECIDER相关配置PATH_REUSE_DECIDER总体流程PATH_REUSE_DECIDER相关子函数IsCollisionFreeTrimHistoryPathIsIgnoredBlockingObstacle和GetBlockingObstacleS Else参考 前言 在Apollo星火计划学习笔记——Apollo路径规划算…

【CSS】CSS 特性 ( CSS 优先级 | 优先级引入 | 选择器基本权重 )

一、CSS 优先级 1、优先级引入 定义 CSS 样式时 , 可能出现 多个 类型相同的 规则 定义在 同一个元素上 , 如果 CSS 选择器 相同 , 执行 CSS 层叠性 , 根据 就近原则 选择执行的样式 , 如 : 出现两个 div 标签选择器 , 都设置 color 文本颜色 ; <style>div {color: re…

Cookie for Mac:隐私保护工具保护您的在线隐私

随着互联网的发展&#xff0c;我们每天都会浏览各种网站&#xff0c;享受在线购物、社交娱乐和学习资料等各种便利。然而&#xff0c;您是否曾经遇到过需要频繁输入用户名和密码的情况&#xff1f;或者不方便访问您常用的网站&#xff1f;如果是这样&#xff0c;那么Cookie for…

【手写promise——基本功能、链式调用、promise.all、promise.race】

文章目录 前言一、前置知识二、实现基本功能二、实现链式调用三、实现Promise.all四、实现Promise.race总结 前言 关于动机&#xff0c;无论是在工作还是面试中&#xff0c;都会遇到Promise的相关使用和原理&#xff0c;手写Promise也有助于学习设计模式以及代码设计。 本文主…

【五】sql 语言 -- 概览

SQL 语言概述SQL 语言提出和发展SQL 语言的功能概述利用 SQL 语言建立数据库学生选课数据库 SCT1. 定义数据库和表 SQL-DDL创建数据库的语句—Create Database创建关系/表的语句—Create Table 2. 向表中追加元组 SQL-DML 利用 SQL 语言进行简单查询单表查询 - SELECT-FROM-WHE…

MySQL安装记录

背景 Windows系统重装了, 想恢复一下之前的MySQL环境, 而且本地数据库也是比较常用的, 刚好本次也在安装, 做一个简单的记录. 也算是自己的学习记录输出. 遇到的问题当然也可以同时记录在这里, 方便后 续回顾. 资料包 百度网盘 // TODO 估计放了也会被CSDN屏蔽, 这里就不放…

Redis 的混合持久化

RDB 相比于 AOF&#xff0c;数据恢复的速度更快&#xff0c;因为是二进制数据&#xff0c;直接加载进内存即可&#xff0c;但是 RDB 的频率不好把握。 如果频率太低&#xff0c;在两次快照期间服务器发生宕机&#xff0c;可能会丢失较多的数据如果频率太高&#xff0c;频繁写入…