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

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

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

相关文章

进程池的子进程的清理工作问题

首先进程池看看代码怎么写的 https://gitee.com/ljh0617/linux_test/blob/master/11-17/3.pipe_use/ProcessPool.cc 我们对子进程分配到的管道读文件描述符进行了重定向,让他改为从0读,这和清理工作无关,只是这么设计让子进程不再有键盘输入…

Java 多线程详细介绍

Java 多线程详细介绍 线程是多线程的支柱。我们生活在一个现实世界中,这个世界本身就被大量应用程序包围着。随着技术的进步,除非我们有效地引入多任务处理的概念,否则我们无法达到同时运行它们所需的速度。这是通过线程的概念实现的。 Java…

二叉树+树的OJ题讲解

求第K层节点个数 思路:走到K1就不走了,一次传回得到的值 #include<stdio.h> #include<stdlib.h> //树的定义 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right; }BTNode;//手…

Android kotlin之配置kapt编译器插件

配置项目目录下的gradle/libs.versions.toml文件&#xff0c;添加kapt配置项&#xff1a; 在模块目录下build.gradle.kt中增加 plugins {alias(libs.plugins.android.application)alias(libs.plugins.jetbrains.kotlin.android)// 增加该行alias(libs.plugins.jetbrains.kotl…

类和对象——拷贝构造函数,赋值运算符重载(C++)

1.拷⻉构造函数 如果⼀个构造函数的第⼀个参数是自身类类型的引用&#xff0c;且任何额外的参数都有默认值&#xff0c;则此构造函数也叫做拷贝构造函数&#xff0c;也就是说拷贝构造是⼀个特殊的构造函数。 // 拷贝构造函数//d2(d1) Date(const Date& d) {_year d._yea…

STM32G4的数模转换器(DAC)功能介绍

目录 概述 1 DAC介绍 1.1 功能 1.2 主要特征 1.3 DAC特性总结 ​2 DAC模块框架结构 3 DAC数据格式 3.1 单DAC通道 3.2 双通道数据格式 3.3 有符号、无符号数据 4 DAC数据转换 ​5 DAC输出电压 概述 本文主要介绍STM32G4的数模转换器&#xff08;DAC&#xff09;功能&a…

Pointnet++改进68:添加FFCM |融合傅里叶卷积

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.理论介绍 …

Linux:解决远程X无法连通问题,X-Server开启TCP连接

一、问题分析 提前申明&#xff1a; 本次实验使用REHL 8 进行操作&#xff01; 客户机 A 为X-Client &#xff0c;即远程X的客户端。 服务机 B 为X-Server&#xff0c;即远程X的服务端。 问题的所有操作均在已经配置好Xorg的前提下进行的&#xff0c;不知道不配置会有什么影响&…

零基础Java第十九期:认识String(一)

目录 一、String的重要性 二、String的常用方法 2.1. 字符串构造 2.2. String对象的比较 2.3. 字符串查找 2.4. 转化 2.4. 字符串替换 2.5. 字符串拆分 2.6. 字符串截取 一、String的重要性 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能…

HarmonyOS4+NEXT星河版入门与项目实战--------ArkTs语言与TypeScript语法

文章目录 1、ArkTs语言1、ArkTs 特点2、ArkTs与Javascript关系 2、TypeScript 语法 1、ArkTs语言 在html的开发中&#xff0c;实现一个页面元素&#xff0c;比如Button&#xff0c;往往包含了以下三种要素&#xff1a;JS、HTML、CSS。JS处理逻辑与响应、HTML 用来声明标签生成…

使用yak编写yakit漏洞检测插件

前言 在使用yakit进行编写yaml插件的时候遇到了yaml无法处理的情况&#xff0c;我不知道是不是yaml无法处理或者说是yakit和yaml的兼容还不够&#xff0c;面对变量的处理还是有些难受&#xff0c;于是花了点时间看了官网的yak语法的手册和其他人写的yak插件尝试使用yak语言来完…

信也科技和云杉网络的AI可观测性实践分享

1. 信也科技 2、云杉网络 2.1 中国移动

Blossom:开源私有部署的markdown笔记软件

在信息化、数字化时代&#xff0c;我们每个人的生活和工作都离不开笔记和知识管理。从简单的待办事项&#xff0c;到复杂的项目计划&#xff0c;再到存储大量个人知识的工具&#xff0c;如何选择一个高效、便捷且符合个人需求的笔记软件&#xff0c;成了许多人的难题。最近在逛…

Spring:DI依赖注入的方式

Spring为我们提供了两种注入方式&#xff0c;分别是: setter注入 简单类型引用类型 构造器注入 简单类型引用类型 setter注入 在bean中定义引用类型属性&#xff0c;并提供可访问的set方法配置中使用property标签ref属性注入引用类型对象 (1)项目中添加BookDao、BookDaoIm…

逆向攻防世界CTF系列37-crackme

逆向攻防世界CTF系列37-crackme 参考https://blog.csdn.net/xiao__1bai/article/details/120230397 nspack的壳&#xff0c;查了一下好像是北斗的一个壳 没找到什么脱壳软件&#xff0c;只能手动脱壳了 手动脱壳的最终要的是ESP定律 ESP定律的原理就是“堆栈平衡”原理 涉及…

按钮权限的操作方法

首先先在你的本地储存里边&#xff0c;加入一些你指定的字段 然后创建一个文件夹&#xff0c;在此文件夹下创建一个js文件&#xff0c;文件内容如下 在你所需要隐藏按钮的页面引入此js文件&#xff0c;并且通过 directives自定义指令绑定你的每一个按钮。在js文件中通过三个常量…

vscode 关闭绑定元素 隐式具有“any”类型这类错误

在vue的项目里面&#xff0c;经常看到any类型的报错&#xff0c;真的很烦的 在tsconfig.json中配置以下参数 “noImplicitAny”: false 就可以了 出现类型“never”上不存在属性“userName”。ts-plugin(2339) 配置该参数 modeuleResolution : node "compilerOptions&qu…

springboot 的 Profile

什么是 Profile &#xff1f; 应用所在的运行环境发生切换时&#xff0c;配置文件常常就需要随之修改。 Profile&#xff1a;——就是一组配置文件及组件的集合。 可以整个应用在不同的profile之间切换&#xff08;设置活动profile&#xff09;&#xff0c;整个应用都将使用该…

onvif协议相关:4.1.6 Digest方式云台控制启动

背景 关于onvif的其实很早之前我已经在专栏中写了不少了, 使用onvif协议操作设备 但最近有陆陆续续的粉丝问我, 希望我在写一些关于 onvif的设备自动发现、预置位跳转、云台操作的博客。 满足粉丝的需求,安排。 今天我们来实现 设备云台的控制(启动) 实现 1.在ONVIF Devi…

【JAVA毕业设计】基于Vue和SpringBoot的农机电招平台

本文项目编号 T 615 &#xff0c;文末自助获取源码 \color{red}{T615&#xff0c;文末自助获取源码} T615&#xff0c;文末自助获取源码 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#x…