网络协议之TCP
一、定义
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。TCP旨在适应支持多网络应用的分层协议层次结构。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。因此,TCP协议的出现,解决了这一问题。
二、TCP协议报文格式
TCP协议报文格式主要包括以下几个部分:
1. 源/目的端口号:
表示数据是从哪个进程来,到哪个进程去。
2. 4位TCP报头长度:
表示该TCP头部有多少个32位bit(有多少个4字节)。TCP头部最大长度是15(2的5次方-1)*4=60字节,即选项内容最多40字节。
3. 6位标志位:
• URG:紧急指针是否有效。• ACK:确认号是否有效。• PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走。• RST:对方要求重新建立连接;携带RST标识的称为复位报文。• SYN:请求建立连接,携带SYN标识的称为同步报文段。• FIN:通知对方,本端要关闭了,携带FIN标识的为结束报文。
4. 16位校验和:
发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含TCP首部,也包含TCP数据部。
5. 16位紧急指针:
标识哪部分数据是紧急数据。当紧急指针置为1,操作系统会优先读取该报文,再读取紧急指针找到紧急数据。
6. 16位窗口大小:
表示当前接受数据的剩余空间。
此外,TCP协议报文格式还包括32位序号和32位确认序号,用于确认应答机制。
三、TCP协议特点
TCP协议具有以下几个主要特点:
1. 面向连接:
TCP是一种面向连接的协议,通信双方在传输数据之前需要先建立连接,然后再进行数据的传输。这种连接方式保证了数据传输的可靠性和顺序性。
2. 可靠传输:
TCP提供可靠的数据传输,通过序列号、确认应答和重传机制来确保数据的完整性和顺序性。如果数据包在传输过程中丢失或损坏,TCP会负责重新发送。
3. 流控制:
TCP使用流控制机制来防止发送方发送速度过快,确保接收方能够处理并消化数据。这通过滑动窗口机制来实现。
4. 拥塞控制:
TCP具有拥塞控制机制,用于适应网络的拥塞情况,防止过多的数据注入网络导致性能下降。
5. 面向字节流:
TCP将传输的数据视为字节流,而不是像UDP那样按照消息边界进行划分。这意味着发送方传输的数据流和接收方接收的数据流是连续的。
6. 全双工通信:
TCP连接是全双工的,允许双方在同一时间既能发送数据又能接收数据。
四、TCP协议工作机制
1. 确认应答(ACK)机制
当客户端传输报文时,为了保证报文被服务端收到,需要服务端进行回应。确认应答机制就是这个原理,即收到请回复。32位序号用来标识发送报文的序号,确认序号则是在收到报文为了进行应答,将收到32号序号+1组成确认序号发生给对方进行应答。即32位确认序号=收到的32报文序号+1,用来表示确认序号之前的报文都收到了。
2. 捎带应答
当客户端给服务端发送报文后,服务端需要对发送的报文进行应答,如果在同时服务端也需要发送报文,那么应答和报文就会一起发送,称为捎带应答。例如,你和室友聊天,你问室友:“你吃了吗?”室友回复:“吃了,你作业写了吗?”这段对话中,室友的回复包含了应答,同时也传输了信息,就是捎带应答。
3. 连接管理机制
TCP连接管理主要包括三次握手建立连接和四次挥手断开连接。
(1)三次握手建立连接
以客户端主动发起连接为例,三次握手的过程如下:
• 第一次握手:客户端调用connect,发送同步报文段(SYN),进入SYN_SENT状态。
• 第二次握手:服务端监听到连接请求(同步报文段),将该连接放入内核等待队列中,并向客户端发送SYN确认报文和ACK确认报文,进入SYN_RCVD状态。
• 第三次握手:客户端收到服务端的确认报文,进入ESTABLISHED状态,开始读写数据。服务端收到客户端的确认报文,也进入ESTABLISHED状态,可以进行读写数据。
三次握手的原因:双方通过两次SYN报文的发送,可以保证全双工通信信道的畅通,同时双方会交换彼此的窗口大小和滑动窗口的头指针位置。三次握手中的最后一次ACK应答的可靠性是无法保证的,如果服务端没有收到客户端的ACK应答,则服务端内核将不会浪费资源构建连接相关的结构体,但是客户端在发送ACK应答后(无论ACK应答是否被对方收到),便默认连接建立成功。这种设计的意义在于连接建立失败的资源消耗成本由客户端来承担,从而减小服务器的负担。
(2)四次挥手断开连接
以客户端主动发起断开连接为例,四次挥手的过程如下:
• 第一次挥手:客户端主动调用close,向服务器发送结束报文段(FIN),同时进入FIN_WAIT_1状态。
• 第二次挥手:服务端收到客户端的结束报文段,返回确认报文段(ACK),进入CLOSE_WAIT状态。客户端收到服务端的确认报文段,进入FIN_WAIT_2状态,开始等待服务端的结束报文段。
• 第三次挥手:服务端准备关闭连接(需要处理完之前的数据),调用close关闭连接,向客户端发送FIN,此时服务器进入LAST_ACK状态,等待最后一个ACK到来(这个ACK是客户端确认收到了FIN)。
• 第四次挥手:客户端收到服务端的FIN,发出确认报文段(ACK),进入TIME_WAIT状态。服务端收到对FIN的ACK,彻底关闭连接。客户端要等待一个2MSL(Max Segment Life,报文最大生存时间)的时间,才会进入CLOSED状态。
TIME_WAIT状态主要是为了等待一些在网络中或者其他地方已经发送但是还没有到达的数据。如果不进行等待,当重新进行连接时,这些数据到达会引起混乱。
4. 滑动窗口
TCP使用滑动窗口机制来实现流控制,防止发送方发送速度过快,确保接收方能够处理并消化数据。滑动窗口的大小表示接收方当前接受数据的剩余空间。发送方在发送数据时,会根据接收方的窗口大小来调整自己的发送速度。当接收方的窗口大小变为0时,发送方会停止发送数据,直到接收方发送窗口更新报文,告知发送方自己的接收能力恢复。
5. 快重传
快重传是一种改进的TCP重传机制。当接收方收到一个失序的报文段时,会立即发送一个重复确认报文(即重复上一个报文段的确认序号),而不是等待超时后再发送。发送方收到连续三个或三个以上的重复确认报文时,会认为下一个报文段丢失了,立即进行重传,而不需要等待超时。这样可以减少数据传输的延迟,提高传输效率。
6. 拥塞控制
TCP具有拥塞控制机制,用于适应网络的拥塞情况,防止过多的数据注入网络导致性能下降。拥塞控制主要包括慢启动、拥塞避免、快重传和快恢复四个阶段。
• 慢启动:在连接建立初期,发送方会以一个较小的初始窗口大小开始发送数据,并逐渐增大窗口大小,直到达到一个预设的阈值或发生网络拥塞。
• 拥塞避免:当发送方的窗口大小达到阈值后,发送方会进入拥塞避免阶段,此时窗口大小的增长速度会减慢,以避免网络拥塞的发生。
• 快重传:如上所述,当接收方收到连续三个或三个以上的重复确认报文时,会认为下一个报文段丢失了,立即通知发送方进行重传。
• 快恢复:当发送方收到快重传的通知后,会立即进行重传,并将窗口大小减半(但不小于慢启动的初始窗口大小),然后重新进入拥塞避免阶段。这样可以更快地恢复数据传输的效率。
五、TCP协议应用示例
TCP协议在计算机网络中具有广泛的应用,以下是一些具体的应用示例:
1. Web浏览
HTTP协议使用TCP作为传输层协议,确保可靠的数据传输,适用于Web页面的加载和数据传输。当用户访问一个网页时,浏览器会向服务器发送HTTP请求,服务器接收到请求后,会将网页内容封装在HTTP响应中发送给浏览器。这个过程中,TCP协议负责保证数据的可靠传输和顺序性。
2. 电子邮件
SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol)等电子邮件协议使用TCP进行邮件的传输和接收。当用户发送一封电子邮件时,邮件客户端会向邮件服务器发送SMTP请求
总结
TCP(传输控制协议)是一种面向连接、可靠的传输层协议,由IETF定义,用于解决IP层不提供可靠流机制的问题。TCP报文格式包括源/目的端口号、报头长度、标志位、校验和、紧急指针、窗口大小等部分,通过序列号和确认序号实现确认应答机制。TCP具有面向连接、可靠传输、流控制、拥塞控制等特点,使用滑动窗口、快重传等机制提高传输效率。其工作机制包括三次握手建立连接、四次挥手断开连接等过程。TCP在Web浏览、电子邮件、文件传输等应用场景中发挥着重要作用,保证了数据的可靠传输和顺序性。
相关文章:
网络协议之TCP
一、定义 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。TCP旨在适应支持多网络应用的分层协议层次结构。在因特网协议族(Internet p…...

《澳鹏AI全景报告2024》分析最新的数据挑战
华盛顿州柯克兰市,2024 年 10 月 22 日 —— Appen Limited(澳大利亚证券交易所代码:APX),一家为人工智能生命周期提供高质量数据的领先供应商,发布了其《2024 年人工智能现状报告》。该报告对美国多个行业…...
【Java每日面试题】—— String、StringBuilder和StringBuffer的区别?
1、String 不可变性:String对象创建后不可变,内容不能被修改,对字符串修改会产生一个新的字符串对象。 线程:线程安全 适用:字符串内容不发生变化或少量字符串操作 String str = "Hello"; str = str + " World"; 2、StringBuffer 不可变性:对…...
【设计模式】【创建型模式(Creational Patterns)】之单例模式
单例模式是一种常用的创建型设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。 单例模式的原理 单例模式的核心在于控制类的实例化过程,通常通过以下方式实现: 私有化构造函数,防止外部直接实例化。…...
form表单的使用
模板 <template><el-form :model"formData" ref"form1Ref" :rules"rules"><el-form-item label"手机号" prop"tel"><el-input v-model"formData.tel" /></el-form-item><el-f…...

PDF内容提取,MinerU使用
准备环境 # python 3.10 python3 -m pip install huggingface_hub python3 -m pip install modelscope python3 -m pip install -U magic-pdf[full] --extra-index-url https://wheels.myhloli.com下载需要的模型 import json import osimport requests from huggingface_hub…...

SpringCloud篇(服务网关 - GateWay)
目录 一、简介 二、为什么需要网关 二、gateway快速入门 1. 创建gateway服务,引入依赖 2. 编写启动类 3. 编写基础配置和路由规则 4. 重启测试 5. 网关路由的流程图 6. 总结 三、断言工厂 四、过滤器工厂 1. 路由过滤器的种类 2. 请求头过滤器 3. 默认…...

自动化测试之unittest框架详解
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 unittest 1、什么是Unittest框架? python自带一种单元测试框架 2、为什么使用UnitTest框架? >批量执行用例 >提供丰富的断…...
Vue3 provide 和 inject的使用
在 Vue 中,provide 和 inject 是 Composition API 的一对功能,用于父子组件之间的依赖注入。它们的作用是让父组件可以向其所有子组件提供数据或方法,而不需要通过逐层传递 props。 1. provide provide 用于父组件中,提供数据或…...
掌握Git分布式版本控制工具:从基础到实践
一、引言 在软件开发过程中,版本控制是不可或缺的一环。Git作为一种分布式版本控制工具,以其高效、灵活的特点,受到了广大开发者的青睐。本文将详细介绍Git的基本概念、工作流程、常用命令,以及在IntelliJ IDEA中的操作方法。 二、…...

AndroidStudio与开发板调试时连接失败或APP闪退的解决方案,涉及SELINUX及获取Root权限
现象 用AndroidStudio打开工程代码,点击运行后,报错: 解决方案 具体原因是尝试运行 su(通常用于获取超级用户权限)时失败了,提示 “Permission denied” 通过 CONFIG_SECURITY_SELINUX 变量控制 SElinux 开启或关闭 在vim /rk3568_android_sdk/device/rockchip/rk…...

VMWARE虚拟交换机的负载平衡算法
一、基于源虚拟端口的路由 虚拟交换机可根据 vSphere 标准交换机或 vSphere Distributed Switch 上的虚拟机端口 ID 选择上行链路。 基于源虚拟端口的路由是 vSphere 标准交换机和 vSphere Distributed Switch 上的默认负载平衡方法。 ESXi主机上运行的每个虚拟机在虚拟交换…...
安卓InputDispatching Timeout ANR 流程
1 ANR的检测逻辑有两个参与者: 观测者A和被观测者B,当然,这两者是不在同一个线程中的。2 A在调用B中的逻辑时,同时在A中保存一个标记F,然后做个延时操作C,延时时间设为T,这一步称为: 埋雷 。3 B中的逻辑如果…...

【Nginx从入门到精通】03 、安装部署-让虚拟机可以联网
文章目录 总结一、配置联网【Minimal 精简版】1.1、查看网络配置1.2、配置ip地址 : 修改配置文件 <font colororange>ifcfg-ens33Stage 1:输入指令Stage 2:修改参数Stage 3:重启网络Stage 4:测试上网 二、配置联网【Everyth…...
java 增强型for循环 详解
Java 增强型 for 循环(Enhanced for Loop)详解 增强型 for 循环(也称为 “for-each” 循环)是 Java 从 JDK 5 开始引入的一种便捷循环语法,旨在简化对数组或集合类的迭代操作。 1. 基本语法 语法格式 for (类型 变量…...

浪潮云启操作系统(InLinux) bcache宕机问题分析
前言 本文以一次真实的内核宕机问题为切入点,结合实际操作案例,详细展示了如何利用工具 crash对内核转储(kdump)进行深入分析和调试的方法。通过对崩溃日志的解读、函数调用栈的梳理、关键地址的定位以及代码逻辑的排查ÿ…...

038集——quadtree(CAD—C#二次开发入门)
效果如下: using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using System; using System.Collections.Generic; using System.Linq; using System.T…...
备赛蓝桥杯--算法题目(1)
1. 链表求和 . - 力扣(LeetCode) class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode *head nullptr, *tail nullptr;int carry 0;while (l1 || l2) {int n1 l1 ? l1->val: 0;int n2 l2 ? l2->val:…...
机器学习100道经典面试题库(二)
机器学习100道经典面试题库(31-60) 在大规模的语料中,挖掘词的相关性是一个重要的问题。以下哪一个信息不能用于确定两个词的相关性。 A、互信息 B、最大熵 C、卡方检验 D、最大似然比 答案:B 解析:最大熵代表了…...
Unet++改进37:添加KACNConvNDLayer(2024最新改进方法)
本文内容:添加KACNConvNDLayer 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 1.步骤一 新建block/kacn_conv.py文件,添加如下代码: import torch import torch.nn as nn##源码地址:https://github.com/SynodicMonth/ChebyKAN class KACNConvNDLaye…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...