C++网络编程之TCP协议

概述

        TCP,即传输控制协议,英文全称为Transmission Control Protocol,是互联网协议套件中的核心协议之一。它工作在OSI七层模型的传输层,也工作在TCP/IP四层模型的传输层。TCP协议的主要目的是:在不可靠的网络环境中提供可靠的、面向连接的、基于字节流的传输服务。

        TCP协议主要具有以下五个特点。

        1、面向连接。TCP在数据传输之前,必须先建立连接。这种连接是通过三次握手过程建立的,确保双方都已准备好进行数据传输。

        2、可靠性。TCP通过一系列机制来确保数据的可靠传输,包括:序列号、确认应答、超时重传、流量控制和拥塞控制等。如果数据在传输过程中丢失或出错,TCP会重新发送数据,直到接收方成功接收为止。

        3、有序性。TCP保证数据按照发送的顺序到达接收方,即使在网络中数据包的到达顺序可能被打乱。

        4、基于字节流。TCP将应用程序发送的数据视为一个无结构的字节流,而不是一系列的消息。TCP负责将字节流分割成适当大小的段,并在接收端重新组合成字节流。

        5、全双工通信。TCP连接允许双方同时发送和接收数据,即通信是双向的。

报文格式

        TCP的报文包括两个部分:报文头和数据。报文头又分为固定部分和选项部分。报文头固定部分为20个字节,各个字段的含义如下。

        1、源端口号:2字节,标识发送方的应用程序端口。

        2、目的端口号:2字节,标识接收方的应用程序端口。

        3、序列号:4字节,标识从TCP源端向目的端发送的数据字节流的起始字节的序列号。

        4、确认号:4字节,只有在ACK标志位为1时才有效,表示下一个期望接收到的字节的序列号。如果确认号为n,则表示接收方已经成功接收到了所有序列号小于n的数据。如果在规定时间内没有收到确认信息,发送方将重新发送报文段,以防止由于网络问题导致的数据丢失。

        5、数据偏移:也称为报头长度,占用4位,表示TCP报头长度(以4字节为单位),因为TCP报头可以包含可选的选项部分。

        6、保留:6位,必须置0。

        7、标志位:6位,每个标志位都有其特定的功能,具体含义如下。

        (1)URG:紧急指针有效。

        (2)ACK:确认号有效。

        (3)PSH:推送数据到接收应用程序。

        (4)RST:重置TCP连接。

        (5)SYN:在连接建立时同步序列号。

        (6)FIN:没有更多数据从应用程序发送。

        8、窗口大小:2字节,指定发送方可接收的数据量。

        9、校验和:2字节,用于检测数据包中的错误。

        10、紧急指针:2字节,只有当URG标志被设置时才有意义,指出紧急数据的最后一个字节相对于序列号的位置。

        报文头选项部分包含一些可选的信息,比如:最大报文长度、窗口扩大因子、时间戳等,用于实现除TCP报文段头部指定功能外的扩展功能。报文头选项部分最长为40个字节,因此,TCP报文头最长可达60个字节。

        报文头之后便是数据部分,这部分包含了从应用程序来的实际数据。数据的长度可变,并且它的长度加上TCP报文头的长度,应该等于整个TCP报文段的长度。

三次握手

        TCP协议通过三次握手的过程来建立一个连接,这一过程确保双方都准备好进行数据交换,并协商了一些必要的参数。三次握手的详细步骤如下。

        第一次握手(SYN):客户端向服务器发送一个SYN(同步序列号)报文段,这个报文段中包含了一个初始序列号,这个序列号用于后续的数据传输。同时,SYN标志位置1。报文段格式为:SYN = 1、序列号 = x。

        第二次握手(SYN-ACK):服务器接收到客户端的SYN报文段后,如果同意建立连接,就会回应一个SYN-ACK报文段。这个报文段中也包含了一个新的序列号以及对客户端序列号的确认(ACK),确认号是客户端序列号加1。报文段格式为:SYN = 1、ACK = 1、序列号 = y、确认号 = x + 1。

        第三次握手(ACK):客户端接收到服务器的SYN-ACK报文段后,会发送一个ACK报文段作为应答。这个ACK报文段的确认号是服务器序列号加1,表明客户端已经收到了服务器的序列号。报文段格式为:ACK = 1、序列号 = x + 1、确认号 = y + 1。

        至此,三次握手完成,TCP连接建立成功,双方现在可以开始交换数据了。每个方向上的数据流都使用自己的序列号和确认号来跟踪数据包的状态,这样就可以确保数据按照正确的顺序到达目的地,并且可以检测出丢失或重复的数据包。

        为了更加形象地理解TCP协议三次握手的过程,可以参考下面的时序图。

四次挥手

        TCP协议的四次挥手是指在TCP连接的终止过程中,所进行的一系列交互。这一过程是为了确保所有已发送的数据都被正确接收,并安全地断开连接。四次挥手的详细步骤如下。

        第一次挥手(FIN):发起方(通常是客户端)发送一个FIN(结束)报文段,告诉对方自己已经没有数据要发送了,希望关闭连接。这个报文段包含一个FIN标志位被设置,以及一个序列号。报文段格式为:FIN = 1、序列号 = x。

        第二次挥手(ACK):接收方(通常是服务器)接收到FIN报文段后,发送一个ACK报文段作为应答。这个ACK报文段的确认号是发起方序列号加1,表明接收方已经收到了发起方的FIN报文段。报文段格式为:ACK = 1、序列号 = y、确认号 = x + 1。此时,发起方到接收方的方向上已经完成了关闭,接收方仍然可以向发起方发送数据。接收方在发送完所有数据后,才会继续后续的步骤。

        第三次挥手(FIN):当接收方也没有数据要发送时,它也会发送一个FIN报文段给发起方,表示自己也完成了数据发送,希望关闭连接。报文段格式为:FIN = 1、ACK = 1、序列号 = z、确认号 = x + 1。

        第四次挥手(ACK):发起方接收到接收方的FIN报文段后,发送一个ACK报文段作为应答。这个ACK报文段的确认号是接收方序列号加1,表明发起方已经收到了接收方的FIN报文段。报文段格式为:ACK = 1、序列号 = x + 1、确认号 = z + 1。

        至此,连接正式关闭,双方都不再发送数据。需要注意的是,在最后一次挥手之后,发起方和接收方都会进入TIME_WAIT状态和CLOSE_WAIT状态一段时间,以确保所有的数据包都被正确接收,并且没有迟到的数据包。在这段时间过后,连接将完全关闭。通过四次挥手的过程,TCP确保了在断开连接之前所有数据都被正确接收,从而维持了连接的可靠性。

        为了更加形象地理解TCP协议四次挥手的过程,可以参考下面的时序图。

数据传输

        TCP协议的数据传输过程是一个复杂的机制,它不仅保证了数据的可靠传输,还提供了流量控制、拥塞控制等功能。在三次握手建立连接之后、四次挥手关闭连接之前,TCP会进行数据的双向传输。双向传输过程中涉及到的一些重要机制和概念包括:数据分割与重组、流量控制、拥塞控制、确认应答、重传机制、错误检测等。下面,分别进行介绍。

        1、数据分割与重组。当应用程序将数据传递给TCP时,TCP会根据最大报文段长度MSS来决定如何将数据分割成多个TCP报文段。每个报文段都包含一个序列号,该序列号标识了这个报文段中第一个字节在整个数据流中的位置。接收端根据接收到的报文段中的序列号将数据重新组装起来,以确保数据按照发送顺序正确地重组。

        2、流量控制。TCP通过滑动窗口机制来进行流量控制,避免发送方发送数据过快导致接收方来不及处理。接收方会在其ACK报文中告诉发送方当前可以接收的最大数据量(即窗口大小),发送方只能发送不超过这个窗口大小的数据。随着接收方处理能力的变化,接收窗口的大小会动态调整,以适应不同的网络状况。

        3、拥塞控制。为了防止网络拥塞,TCP实现了一系列的拥塞控制算法,比如:慢启动、拥塞避免、快速重传和快速恢复等。

        (1)慢启动。当连接刚刚建立或发生超时重传时,TCP采用慢启动策略,逐渐增加发送速率,直到达到某个阈值或出现丢包。

        (2)拥塞避免。一旦进入稳定状态,TCP会使用拥塞避免算法来维持一个相对稳定的发送速率,同时监测网络拥塞情况。

        (3)快速重传。如果发送方连续收到相同的ACK,则认为有报文丢失,并立即重传该报文,而不等待超时定时器到期。

        (4)快速恢复。在快速重传后,TCP进入快速恢复阶段,继续调整发送速率,直到网络状况恢复正常。

        4、确认应答。当接收方正确地接收到一个TCP报文段后,它会发送一个ACK报文段给发送方。这个ACK报文段中包含了确认号,该号码是期望接收的下一个字节的序列号。比如:如果接收方收到了序列号为100到200的数据,那么ACK报文段中的确认号将是201,表示“我已经收到了直到200为止的所有数据,接下来请发送从201开始的数据”。

        5、重传机制。TCP为每个报文段设置了一个重传计时器,如果在这个时间内没有收到相应的ACK,就认为报文段丢失并重发。如果发送方收到连续的重复ACK,则可能意味着某个报文段丢失或延迟,此时发送方会提前重传丢失的报文段。

        6、错误检测。每个TCP报文段都包含一个校验和字段,用于检测传输过程中可能出现的数据损坏。如果计算出的校验和与接收到的不匹配,报文段会被丢弃,并要求重传。

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

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

相关文章

腾讯一面-LRU缓存

为了设计一个满足LRU(最近最少使用)缓存约束的数据结构,我们可以使用哈希表(HashMap)来存储键值对,以便在O(1)时间复杂度内访问任意键。同时,我们还需要一个双向链表(Doubly Linked …

飞创龙门双驱XYZ直线模组高精度应用实例

飞创龙门双驱XYZ直线模组集超精密定位、高动态响应和灵活配置于一体,适用于电子制造行业(点胶、组装、检测)、半导体圆晶加工、芯片封装、激光切割、激光焊接、数控机床、精密检测及科研实验等,满足高精度、高动态的三维定位需求&…

NVIDIA Hopper 架构深入

在 2022 年 NVIDIA GTC 主题演讲中,NVIDIA 首席执行官黄仁勋介绍了基于全新 NVIDIA Hopper GPU 架构的全新 NVIDIA H100 Tensor Core GPU。 文章目录 前言一、NVIDIA H100 Tensor Core GPU 简介二、NVIDIA H100 GPU 主要功能概述1. 新的流式多处理器 (SM) 具有许多性能和效率…

Golang | Leetcode Golang题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; func findMinArrowShots(points [][]int) int {if len(points) 0 {return 0}sort.Slice(points, func(i, j int) bool { return points[i][1] < points[j][1] })maxRight : points[0][1]ans : 1for _, p : range points {if p[0] > …

docker下载mysql时出现Unable to pull mysql:latest (HTTP code 500) server error 问题

报错 Unable to pull mysql:latest (HTTP code 500) server error - Get “https://registry-1.docker.io/v2/”: EOF 解决方法 将VPN开到Global模式 解决啦

从面向过程(pop)到面向对象(oop)

文章目录 1. 情境2. 抛出问题3. 给出解决方案4. 方案存在的bug5. 补救措施6. 得出结论&#xff1a;该方案实际是不可行的7. 总结上述代码思考方式 -- 基于过程① 思考方式② 上述思考方式存在的问题基于过程的思维方式核心基于过程的思维方式的缺点 8. 转变思维&#xff0c;引出…

无水印短视频素材下载网站有哪些?十个高清无水印视频素材网站分享

你知道怎么下载无水印视频素材吗&#xff1f;今天小编就给大家推荐十个高清无水印视频素材下载的网站&#xff0c;如果你也是苦于下载高清无水印的短视频素材&#xff0c;赶紧来看看吧&#xff5e; 1. 稻虎网 首推的是稻虎网。这个网站简直就是短视频创作者的宝库。无论你需要…

深度学习基础—残差网络ResNets

1.残差网络结构 当网络训练的很深很深的时候&#xff0c;效果是否会很好&#xff1f;在这篇论文中&#xff0c;作者给出了答案&#xff1a;Deep Residual Learning for Image Recognitionhttps://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_…

OpenAI o1 与 GPT-4o:前沿AI全面比较下你更倾向哪一款

前言 就在前不久&#xff0c;OpenAI 发布了推理能力更强可达理科博士生水准的o1 模型&#xff0c;业界也表示这标志着人工智能发展的新里程碑&#xff0c;特别是在复杂问题解决和推理方面。 然而&#xff0c;该模型与其前身GPT-4o有很大不同&#xff0c;后者仍然广泛用于通用…

Pix2Pix实现图像转换

tutorials/application/source_zh_cn/generative/pix2pix.ipynb MindSpore/docs - Gitee.com Pix2Pix概述 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c;该模型是由Ph…

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例 在某地市的 XX 音乐节保障准备期间&#xff0c;为确保活动期间的网络质量&#xff0c;现场新开了 4.9G HUAWEI 室外基站。在网络优化和测试中&#xff0c;发现UE无法实现从 2.6G 到 4.9G 的正常切换。虽然现场具备 4.9G信号覆…

Python | Leetcode Python题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; class Solution:def findDisappearedNumbers(self, nums: List[int]) -> List[int]:n len(nums)for num in nums:x (num - 1) % nnums[x] nret [i 1 for i, num in enumerate(nums) if num < n]return ret

YOLOv8 结合设计硬件感知神经网络设计的高效 Repvgg的ConvNet 网络结构 ,改进EfficientRep结构

一、理论部分 摘要—我们提出了一种硬件高效的卷积神经网络架构,它具有类似 repvgg 的架构。Flops 或参数是评估网络效率的传统指标,这些网络对硬件(包括计算能力和内存带宽)不敏感。因此,如何设计神经网络以有效利用硬件的计算能力和内存带宽是一个关键问题。本文提出了一…

1、Spring Boot 3.x 集成 Eureka Server/Client

一、前言 基于 Spring Boot 3.x 版本开发&#xff0c;因为 Spring Boot 3.x 暂时没有正式发布&#xff0c;所以很少有 Spring Boot 3.x 开发的项目&#xff0c;自己也很想了踩踩坑&#xff0c;看看 Spring Boot 3.x 与 2.x 有什么区别。自己与记录一下在 Spring Boot 3.x 过程…

exe4j安装使用教程

A-XVK258563F-1p4lv7mg7sav A-XVK209982F-1y0i3h4ywx2h1 A-XVK267351F-dpurrhnyarva A-XVK204432F-1kkoilo1jy2h3r A-XVK246130F-1l7msieqiwqnq A-XVK249554F-pllh351kcke50

第5篇:MySQL日志分析----应急响应之日志分析篇

常见的数据库攻击包括弱口令、SQL注入、提升权限、窃取备份等。对数据库日志进行分析&#xff0c;可以发现攻击行为&#xff0c;进一步还原攻击场景及追溯攻击源。 0x01 Mysql日志分析 general query log能记录成功连接和每次执行的查询&#xff0c;我们可以将它用作安全布防…

Android SystemUI组件(08)睡眠灭屏 锁屏处理流程

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 睡眠灭屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来完…

【数据结构】图的最小生成树

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C游记》《进击的C》《Linux迷航》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、最小生成树的概念二、Kruskal算法2.1 思想2.2 实现 三、Prim算法3.1 思想3.2 实现 四、Kruskal和Prim的对比…

Spring Task 调度任务

Spring Task是调度任务框架&#xff0c;通过配置&#xff0c;程序可以按照约定的时间自动执行代码逻辑&#xff0c;基于注解方式实现需要如下注解&#xff1a; Component 任务调度类交给Spring IOC容器管理EnableScheduling 启用 Spring 的定时任务&#xff08;Scheduling&…