TCP/IP超全笔记 - TCP篇

TCP/IP超全笔记 - TCP篇

什么是 TCP

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的可靠的基于字节流传输层通信协议。

  • 面向连接:一对一,先连接,再传输数据
  • 可靠交付:保证数据准确
  • 面向字节流:把数据看成一连串的无结构字节流

网络模型

七层模型

  • 应用层
  • 表示层
  • 会话层
  • 传输层:TCP/UDP
  • 网络层: IP
    • 寻址和路由选择
    • 路由器,防火墙,多层交换机
  • 数据链路层
    • 关注数据的传输和流控制、差错检测和纠正等逻辑控制功能
    • 数据单元是帧(frame)
    • 网卡、交换机
    • MAC地址
  • 物理层
    • 主要是将数字信号转化为模拟信号,并通过物理媒介传输信号
    • 关注传输媒介,信号的传输和电气规范等物理特性
    • 数据单元是比特

五层模型

  • 应用层
  • 传输层:TCP/UDP
  • 网络层: IP
  • 数据链路层
  • 物理层

四层模型

  • 应用层:HTTP、FTP、SMTP
  • 传输层:TCP/UDP,数据包 Segment
  • 网络层: 负责数据的包装,寻址和路由,IP、RIP、ICMP,数据包 Packet
  • 网络接口层:ARP协议,数据包 Frame

TCP 三次握手

  • client -> server: SYN = 1, seq = u,告诉服务器,我准备连接了
  • server -> client: SYN = 1, ACK = 1, ack = u + 1, seq = v,告诉客户端,我可以被连接
  • client -> server: ACK = 1, ack = v + 1, seq = u + 1,告诉服务器,我准备开始传输数据

为啥要三次握手,只要前两次握手不行么?
因为网络是不可靠的,如果只进行两次握手,那么可能会出现如下情况:
client发送第一个连接的请求报文,但由于网络问题,请求没有立即到服务端,而是在网络节点滞留了,直到某个时间才到达server,但是这个时候,可能已经变成了个失效的报文,但是server还是以为client要连接它,所以server会回复一个连接成功的报文,但是client根本不会理睬,所以server白白浪费了一个连接成功的报文。
为了避免这种情况,所以要进行三次握手。

TCP 四次挥手

  • client -> server: FIN = 1, seq = u,告诉服务器,我马上要关闭了
  • server -> client: ACK = 1, ack = u + 1, seq = v,告诉客户端,我知道你马上要关闭了

但服务端可能还有数据没发送完成,所以这时候要等待server数据发送完成

  • server -> client: FIN = 1, seq = w,server数据终于发送完了,告诉客户端,我马上也要关闭了
  • client -> server: ACK = 1, ack = w + 1, seq = u + 1,客户端收到server的FIN,知道server要关闭了

client 处于TIME_WAIT状态,等待2MSL后关闭连接,为啥?

  1. client最后回的ACK,server可能会没收到,从而导致server再次发送FIN,如果client这时候已经关闭了,那么就会导致server错误
  2. 如果client发送最后的ACK之后直接进入关闭状态,然后再次连接Server,如果端口恰好相同的话,且前一次的连接有数据滞留在网络中,这个时候最新一次的连接就会收到上一次连接的脏数据,导致数据包混乱。

TCP 状态流转

TCP 头部格式

  • 源端口号:16bit
  • 目标端口号:16bit
  • 序列号:32bit

一次TCP通信(从连接建立到断开)过程中某个传输方向上的字节流的字节在数据流上的索引

  • 确认应答号:32bit
  • 首部长度:4bit, tcp头有多少个32bit,故TCP头最多60字节
  • 保留:6bit
  • URG:1bit
  • ACK: 1bit,用于确认应答
  • PSH: 1bit
  • RST: 1bit
  • SYN: 1bit,用于建立连接
  • FIN: 1bit,用于释放连接
  • 窗口大小:16bit,用于TCP流量控制,接收缓冲区还能容纳多少字节的数据,以便于发送方控制发送数据的速度
  • 校验和:16bit,用于数据校验
  • 紧急指针:16bit
  • 选项:可变长度
  • 数据

连接建立中的异常

  • SYN 攻击

攻击者伪造很多IP地址,对目标服务器发送SYN连接请求,服务器回复确认包,并等待攻击者的ACK,由于伪造IP地址,所以攻击者根本不会回ACK,导致服务器端一直处于等待状态,从而导致服务器端资源耗尽,无法为正常用户提供服务。

服务器没收到第三次握手ACK时,会重发(Linux环境下,重发5次,每次间隔1s、2s、4s、8s、16s、32s),重发耗时很长,短时间大量SYN请求会导致资源耗尽。

解决方案:缩短重试时间间隔、

TCP如何实现可靠传输

停止等待方式

  • 设定时间内未收到确认则进行重传
  • 发送数据完等待ACK,效率低

流水线传输方式

  • 采用滑动窗口协议,允许发送端发送多个数据包,而不需要等待对方确认
  • 当发送数据包达到窗口上限时停止发送(窗口大小设置多少合适呢?有没有说法?)
  • 接收端收到数据包后,返回ACK,发送端滑动窗口右移,继续发送数据
  • 接收端发送的ACK,并不一定是当前接收到的包序号,而是返回已连续接收的最大的包序号+1,比如收到1,2,3这时候返回4(表示我已经收到了4之前的报文),如果后续收到了5,7,8,回复的三个ACK都会是4,然后又收到数据包4,则ACK返回6,发送端这时候就知道1-5都接收成功了,滑动窗口直接右移到6开始
  • 超时重传机制:发送端滑动窗口内数据包一定时间没收到ACK,则会启动重发机制,直到收到ACK。
  • 快速重传机制:如果发送端收到同一报文的三次冗余确认,就会认为这条报文的下一条丢失,不管是否超时都会进行重发

TCP流量控制

接收端处理数据的能力有限,如果发送太快超过了接收端处理能力,就会把接收端缓冲区打满,这时候就会导致丢包,发送端又得重发。因此,需要根据接收端能力来控制发送速度。

  • 接收端发送ACK时,返回窗口大小,即剩余缓冲区大小。
  • 发送端根据接收端返回的窗口大小来控制发送速度。
  • 如果接收端返回窗口大小为0,则发送端停止发送数据,但仍需要定时发送一个窗口探测数据段,不然发送端不知道啥时候接收端可以再接收数据了。

TCP拥塞控制

在不清楚当前网络状态下,贸然发送大量数据,可能会引起计算机网络的拥塞,导致网络性能下降,严重时甚至会导致网络瘫痪,另外网络情况时刻在变化,网络变得拥堵/空闲,都要及时调整发送速度,一方面避免加剧网络堵塞,一方面最大限度地利用网络资源。因此,TCP需要根据网络拥塞情况来动态调整发送数据量,以避免网络拥塞。

慢启动

  • 拥塞窗口先设置为1,后面每次都翻倍,直到出现数据传输超时或者触发了快速重传。
  • 如果传输超时,可能网络出现严重堵塞(需要立即减少发送),这时候需要将慢启动阈值设置为拥塞窗口的一半,然后重新开始慢启动过程(拥塞窗口设置为1),直到拥塞窗口增加到慢启动阈值,然后改为拥塞避免模式。
  • 如果触发了快速重传,则将慢启动阈值减半,然后将拥塞窗口设置为原先的一半 + 3,触发快速重传,说明发送端还能收到ACK,说明网络没有那么严重的堵塞,这时候减半发送就够了,没必要降为1,这时候进入快速恢复模式

拥塞避免

拥塞避免阶段是个速率增加缓慢且线性增长的过程

  • 每收到一个ACK,拥塞窗口+1
  • 如果发生了超时,则将慢启动阈值设置为拥塞窗口的一半,然后重新开始慢启动过程(拥塞窗口设置为1)
  • 如果触发了快速重传,则将慢启动阈值减半,然后将拥塞窗口设置为原先的一半 + 3,然后进入快速恢复模式

快速恢复

  • 每收到一个冗余的确认报文,则拥塞窗口+1
  • 如果出现数据传输超时,则将慢启动阈值设置为拥塞窗口的一半,然后重新开始慢启动过程(拥塞窗口设置为1)
  • 如果发送方接收到新的确认报文,则拥塞窗口设置为慢启动阈值,然后进入拥塞避免模式

为啥收到冗余确认报文,拥塞窗口还要+1?按理来说,没有收到新的确认报文,这个时候还是拥堵的,为啥还有增长?原因在于,新收到冗余确认报文后,意味着网络中腾出了一条报文的空间,所以可以再发一条,但是这个时候拥塞窗口已经满了,只有再+1,才能再发一条数据。

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

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

相关文章

openGauss gsql 常用元命令 一

openGauss gsql 常用元命令 一 连接数据库 使用 -E 参数可以显示元命令具体执行的 SQL 信息 [ommog1 ~]$ gsql -d postgres -p15400 -E gsql ((openGauss 2.1.0 build 590b0f8e) compiled at 2021-09-30 14:29:04 commit 0 last mr ) Non-SSL connection (SSL connection is…

【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引

一、聚簇索引 其实之前内容中介绍的 B 树就是聚簇索引。 这种索引不需要我们显示地使用 INDEX 语句去创建,InnoDB 引擎会自动创建。另外,在 InnoDB 引擎中,聚簇索引就是数据的存储方式。 它有 2 个特点: 特点 1 使用记录主键…

HTTPS安全机制解析:如何保护我们的数据传输

引言 在数字时代,网络安全成为了互联网用户和服务提供者不可忽视的关键议题。特别是,HTTPS(全称为HyperText Transfer Protocol Secure)相比于其前身HTTP(HyperText Transfer Protocol),通过引…

如何恢复已删除的华为手机图片?5 种方式分享

不幸的现实是,华为的珍贵时刻有时会因为意外删除、软件故障或其他不可预见的情况而在眨眼之间消失。在这种情况下,寻求恢复已删除的图片成为个人迫切关心的问题。 本文旨在为用户提供如何从华为恢复已删除图片的实用解决方案。我们将探索五种可行的方法…

6-1 判回文

作者 唐艳琴 单位 中国人民解放军陆军工程大学 本题要求实现一个函数,判断字符串是否是回文。如果是则返回1,否则返回0。 函数接口定义: int isecho(char a[]);返回值为1,表示是回文;返回值为0,表示不是…

光线追踪5- Surface normals and multiple objects

首先,让我们获取一个表面法线,以便进行着色。这是一个垂直于交点处表面的向量。在我们的代码中,我们需要做一个重要的设计决定:法线向量是否为任意长度,还是将其归一化为单位长度。 诱人的是,如果不…

视频远程监控平台EasyCVR集成后播放只有一帧画面的原因排查与解决

智慧安防视频监控平台EasyCVR能在复杂的网络环境中(专网、局域网、广域网、VPN、公网等)将前端海量的设备进行统一集中接入与视频汇聚管理,平台可支持的接入协议包括:国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议…

【STM32下UART协议的一些认识与使用方法】

STM32下UART协议的一些认识与使用方法 串口定义通用串行异步收发器 协议中相关的概念空闲位起始位数据位奇偶校验位三种校验方式BT接收数据的流程 停止位波特率总结 UART的三种工作方式UART控制器发送数据流程接收数据流程 UART初始化UART相关结构体和库函数 串口定义 通用串行…

揭秘共享旅游卡项目变现的6种方式,至少有4种适合创业者!

最近每天都有不少的朋友添加我,多数人会问一个问题,共享旅游卡这个项目好不好做?还有部分朋友会问,共享旅游卡有没有市场,是不是有我们所宣传的这样乐观? 从过年前开始,我一直在关注咱们共享旅…

自然语言处理之语言模型(LM)深度解析

自然语言处理(Natural Language Processing,NLP)作为人工智能的一个重要分支,近年来在学术界和工业界均取得了显著的进展。语言模型(Language Model, LM)是自然语言处理技术中的基石,它能够预测…

云计算 3月6号 (crontab-计划任务 日志轮转 免密登录)

一、计划任务 计划任务概念解析 在Linux操作系统中,除了用户即时执行的命令操作以外,还可以配置在指定的时间、指定的日期执行预先计划好的系统管理任务(如定期备份、定期采集监测数据)。RHEL6系统中默认已安装了at、crontab软件…

抖音视频评论区用户采集工具使用教程

抖音视频评论区用户采集工具是一款用于收集抖音视频评论区用户信息的工具。通过该工具,用户可以提取抖音视频评论区的用户昵称、评论内容、点赞数等信息,并进行数据分析和统计。该工具可以帮助用户了解抖音视频评论区的用户特点和评论趋势,提…

基于Spring Boot + Vue的信息化在线教学平台

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…

事务 失效的八种情况

在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么同时失败),避免数据不一致的情况,我们一般都会用到 spring 事务。 确实,sprin…

Android视角看鸿蒙第一课(工程目录)

Android视角看鸿蒙第一课(工程目录) 导读 鸿蒙马上就来了,这个工作很有可能落到Android开发的头上,既是机遇也是挑战,希望能跟上时代的浪潮,迫不得已开始学习鸿蒙开发,顺带分享记录下 我的学…

【python】对角线遍历

python系列文章目录 【python】基于cv2提取图片上的文本内容 【python】简单作图 【python】数组字符串等实用 【python】sort与sorted排序使用 【python】对角线遍历 python系列文章目录说明1.分析2.注意事项2.1 遍历2.2 区间2.3 顺序 3.代码实现 说明 给你一个大小为 m x n…

Java方法重载

重载 概念 重载就是在一个类中,有相同的函数名,但形参不同的函数 规则 方法名称必须相同参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)方法的返回值类型可以相同也可以不同仅仅返回类型不同不足以成为方法的重载 实…

MySQl基础入门③

上一遍内容 接下来我们都使用navicat软件来操作数据了。 1.新建数据库 先创建我门自己的一个数据库 鼠标右键点击bendi那个绿色海豚的图标,然后选择新建数据库。 数据库名按自己喜好的填,不要写中文, 在 MySQL 8.0 中,最优的字…

【MATLAB】语音信号识别与处理:卷积滑动平均滤波算法去噪及谱相减算法呈现频谱

1 基本定义 卷积滑动平均滤波算法是一种基于卷积操作的滤波方法,它通过对信号进行卷积运算来计算移动平均值,以消除噪声。该算法的主要思想是将滤波窗口的加权系数定义为一个卷积核,对信号进行卷积运算来得到平滑后的信号。这样可以有效地去…

Java基于微信小程序的高校讲座预约系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…