网络协议之TCP

news2024/11/18 7:23:39

一、定义

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浏览、电子邮件、文件传输等应用场景中发挥着重要作用,保证了数据的可靠传输和顺序性。

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

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

相关文章

STM32低功耗设计NFC与无线距离感应智能钥匙扣

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 在当今快速发展的物联网(IoT)时代&#xf…

Pyhon基础数据结构(列表)【蓝桥杯】

a [1,2,3,4,5] a.reverse() print("a ",a) a.reverse() print("a ",a)# 列表 列表(list)有由一系列按照特定顺序排序的元素组成 列表是有顺序的,访问任何元素需要通过“下标访问” 所谓“下标”就是指元素在列表从左…

关于win11电脑连接wifi的同时,开启热点供其它设备连接

背景: 我想要捕获手机流量,需要让手机连接上电脑的热点。那么问题来了,我是笔记本电脑,只能连接wifi上网,此时我的笔记本电脑还能开启热点供手机连接吗?可以。 上述内容,涉及到3台设备&#x…

SAP SD学习笔记13 - 出库确认(发货)之后的取消 - VL09

上一章讲了出荷传票的总结,以及出荷相关的其他知识,比如出荷控制,出荷传票登录的各种Tr-cd,Picking场所的决定,出荷传票的变更等内容。 SAP SD学习笔记12 - 出荷传票总结,出荷控制(出荷Type,出…

IDEA优雅debug

目录 引言一、断点分类🎄1.1 行断点1.2 方法断点1.3 属性断点1.4 异常断点1.5 条件断点1.6 源断点1.7 多线程断点1.8 Stream断点 二、调试动作✨三、Debug高级技巧🎉3.1 watch3.2 设置变量3.3 异常抛出3.4 监控JVM堆大小3.5 数组过滤和筛选 引言 使用ID…

MyBatisPlus(Spring Boot版)的基本使用

1. 初始化项目 1.1. 配置application.yml spring:# 配置数据源信息datasource:# 配置数据源类型type: com.zaxxer.hikari.HikariDataSource# 配置连接数据库信息driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis_plus?characterEncodi…

串口DMA接收不定长数据

STM32F767—>串口通信接收不定长数据的处理方法_stm32串口超时中断-CSDN博客 STM32-HAL库串口DMA空闲中断的正确使用方式解析SBUS信号_stm32 hal usart2 dma-CSDN博客 #define USART1_RxBuffSize 100 extern DMA_HandleTypeDef hdma_usart1_rx; //此处声明的变量在…

【Linux】进程字段、环境变量与进程地址空间

🌈 个人主页:谁在夜里看海. 🔥 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 丢掉幻想,准备斗争 目录 一、查看进程字段 1.字段说明 2.进程优先级 二、环境变量 1.概念 2.指令与PATH 3.环境变…

无人机场景 - 目标检测数据集 - 车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍:无人机场景车辆检测数据集,真实场景高质量图片数据,涉及场景丰富,比如无人机场景城市道路行驶车辆图片、无人机场景城市道边停车车辆图片、无人机场景停车场车辆图片、无人机场景小区车辆图片、无人机场景车辆遮挡、车…

【C++】vector 类模拟实现:探索动态数组的奥秘

🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 如果你对string,vector还存在疑惑,欢迎阅读我之前的作品 : 之前文章🔥&#x1f52…

小程序-基于java+SpringBoot+Vue的驾校预约平台设计与实现

项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

初识算法 · 模拟(1)

目录 前言: 替换所有的问号 题目解析 算法原理 算法编写 提莫攻击 题目解析 算法原理 算法编写 外观数列 题目解析 算法原理 算法编写 前言: ​本文的主题是模拟,通过三道题目讲解,一道是提莫攻击,一道是…

使用 Vue 和 Create-Vue 构建工程化前端项目

目录 前言1. 工程化的意义与 Vue 的生态支持2. 搭建 Vue 工程化项目2.1 环境准备2.2 使用 create-vue 创建项目2.2.1 初始化项目2.2.2 安装依赖2.2.3 本地运行 3. Vue 项目的目录结构解析4. Vue 开发流程详解4.1 项目入口与根组件4.1.1 main.js 的作用4.1.2 App.vue 的结构 4.2…

Android中的AMS(Activity Manager Service)详解

Android中的AMS(Activity Manager Service)详解 AMS (Activity Manager Service) 是 Android 系统中非常核心的服务之一,它负责管理应用程序的生命周期、任务栈、进程、广播、服务等功能。AMS 是整个 Android Framework 的调度中心&#xff…

31.3 XOR压缩和相关的prometheus源码解读

本节重点介绍 : xor 压缩value原理xor压缩过程讲解xor压缩prometheus源码解读xor 压缩效果 xor 压缩value原理 原理:时序数据库相邻点变化不大,采用异或压缩float64的前缀和后缀0个数 xor压缩过程讲解 第一个值使用原始点存储计算和前面的值的xor 如果XOR值为0&…

UNIAPP发布小程序调用讯飞在线语音合成+实时播报

语音合成能够将文字转化为自然流畅的人声,提供100发音人供您选择,支持多语种、多方言和中英混合,可灵活配置音频参数。广泛应用于新闻阅读、出行导航、智能硬件和通知播报等场景。 在当下大模型火爆的今日,语音交互页离不开语音合…

【蓝牙协议栈】【BLE】【BAS】精讲蓝牙电池服务

1. 蓝牙电池服务(Bluetooth Battery Service)概念 蓝牙电池服务是蓝牙设备与其他设备通信时用于报告其剩余电池电量的标准服务。它让用户能够随时了解蓝牙设备(如无线耳机、智能手表、蓝牙鼠标/键盘等)的电池状态,从而方便地管理这些设备的续航与电源使用。 BAS通常用于在…

无线迷踪:陈欣的网络之旅

第一章 陈欣是一名资深的网络工程师,工作在一家领先的科技公司。她的生活平静而有序,直到有一天,公司的无线网络突然出现了严重的问题。员工们的设备频繁断开连接,无法正常使用。这个问题不仅影响了工作效率,还引起了…

【redis】—— 环境搭建教程

上一节,我们大致了解了Redis的几个重要版本,在本教程中,我们选择了5.0版本,因为5.0已经具备了大部分的功能特性,并且与7.0版本相比,其安装使用过程更为简便。 Redis的官方并不直接支持微软的Windows操作系统…

如何查看python源代码

众所周知,Python内建了许多函数模块,并且我们可能还会安装许多第三方模块等等。 下面以getpass为例查看其源代码。 1.help(getpass) 输入该命令找到file路径,并且可以查看其其提供的功能。 2.利用getpass.__file__查看位置 最后找到该文件…