网络协议之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…...
基于 Levenberg - Marquardt 法的 BP 网络学习改进算法详解
基于 Levenberg - Marquardt 法的 BP 网络学习改进算法详解 一、引言 BP(Back Propagation)神经网络在众多领域有着广泛应用,但传统 BP 算法存在收敛速度慢、易陷入局部最优等问题。Levenberg - Marquardt(LM)算法作…...
MySQL 8.0与PostgreSQL 15.8的性能对比
根据搜索结果,以下是MySQL 8.0与PostgreSQL 15.8的性能对比: MySQL 8.0性能特点: MySQL在处理大量读操作时表现出色,其存储引擎InnoDB提供了行级锁定和高效的事务处理,适用于并发读取的场景。MySQL通过查询缓存来提高读…...
qt连接postgres数据库时 setConnectOptions函数用法
连接选项,而这些选项没有直接的方法对应,你可能需要采用以下策略之一: 由于Qt SQL API的限制,你可能需要采用一些变通方法或查阅相关文档和社区资源以获取最新的信息和最佳实践。如果你确实需要设置特定的连接选项,并且…...
MySQL45讲 第二十七讲 主库故障应对:从库切换策略与 GTID 详解——阅读总结
文章目录 MySQL45讲 第二十七讲 主库故障应对:从库切换策略与 GTID 详解一、一主多从架构与主备切换的挑战(一)一主多从基本结构(二)主备切换的复杂性 二、基于位点的主备切换(一)同步位点的概念…...
JavaWeb笔记整理——Spring Task、WebSocket
目录 SpringTask cron表达式 WebSocket SpringTask cron表达式 WebSocket...
基于SpringBoot+RabbitMQ完成应⽤通信
前言: 经过上面俩章学习,我们已经知道Rabbit的使用方式RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)-CSDN博客作为⼀个消息队列,RabbitMQ也可以⽤作应⽤程…...
Flutter踩坑记录(一)debug运行生成的项目,不能手动点击运行
问题 IOS14设备,切后台划掉,二次启动崩溃。 原因 IOS14以上 flutter 不支持debugger模式下的二次启动 。 要二次启动需要以release方式编译工程安装至手机。 操作步骤 清理项目:在命令行中运行flutter clean来清理之前的构建文件。重新构…...
React的hook✅
为什么hook必须在组件内的顶层声明? 这是为了确保每次组件渲染时,Hooks 的调用顺序保持一致。React利用 hook 的调用顺序来跟踪各个 hook 的状态。每当一个函数组件被渲染时,所有的 hook 调用都是按照从上到下的顺序依次执行的。React 内部会…...
2024.5 AAAiGLaM:通过邻域分区和生成子图编码对领域知识图谱对齐的大型语言模型进行微调
GLaM: Fine-Tuning Large Language Models for Domain Knowledge Graph Alignment via Neighborhood Partitioning and Generative Subgraph Encoding 问题 如何将特定领域知识图谱直接整合进大语言模型(LLM)的表示中,以提高其在图数据上自…...
从熟练Python到入门学习C++(record 6)
基础之基础之最后一节-结构体 1.结构体的定义 结构体相对于自定义的一种新的变量类型。 四种定义方式,推荐第一种;第四种适合大量定义,也适合查找; #include <iostream> using namespace std; #include <string.h>…...
做网站配置/最近一周的重大热点新闻
设置父级div为相对位置 设置子级div为绝对位置 代码如下: <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><div style"width: 100%; height: 600px; border:…...
沧州市任丘建设局网站/百度如何购买关键词
如何手写一个过滤器呢。假设我现在需要一个计时过滤器,我想把每一次调用服务锁花费的时间打印到控制台,我该怎么做呢? ####拦截机制有三种: ######1. 过滤器(Filter)能拿到http请求,但是拿不到处…...
给别人做网站收多少钱/惠州百度seo哪家好
Spring MVC属于SpringFrameWork的后续产品,它提供了构建 Web 应用程序的全功能 MVC 模块,与Struts2一样是一种优秀MVC框架,不同的是自Spring2.5引入了注解式controller及Spring 3以后的不断完善,使得采用Spring MVC框架开发结构清…...
美食门户网站建设目标/搜收录批量查询
转载:http://www.cnblogs.com/obama/p/3292335.html 作者: 曾见绝美的阳光 第一部分:TCP/IP相关知识点对TCP/IP的整体认链路层知识点IP层知识点运输层知识点应用层知识点(这些知识点都可以参考:http://www.cnblogs.co…...
黄岛开发区做网站的公司/百度收录快的发帖网站
这里写目录标题学习其他模型链接一、引言二、RNN本质三、RNN模型四、RNN的应用五、RNN训练的算法(一)随时间反向传播(backpropagation through time,BPTT)(二)实时循环学习(real-tim…...
wordpress无法找到页面/百度服务电话在线人工
qtz中如果画曲线涉及到旋转会使用矩阵变幻,这儿有一个秘诀,就是先平移到旋转中心,在设置旋转角度,然后平移到旋转中心的负方向,最后就可以按需求画出来 p.drawRect(QRect(100,100,200,200));p.translate(200,200);p.ro…...