C++网络编程之TCP协议

news2024/10/4 9:48:38

概述

        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.coloradmin.cn/o/2187785.html

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

相关文章

基础算法--枚举

枚举算法是一种简单而有效的算法,它通过枚举所有可能的情况来解决问题。它通常用于解决问题规模比较小的问题,因为它的时间复杂度很高,随着问题的规模增加,算法的效率会急剧下降。 枚举算法的基本思路是通过循环遍历所有可能的情…

(C语言贪吃蛇)13.实现贪吃蛇四方向的移动

目录 前言 原代码预览 解决方法⚠️ 运行效果 总结 前言 我们上节通过Linux线程实现了两个while(1)同时运行,这样就可以一边控制方向一遍刷新出贪吃蛇的身体节点了。本节我们就来实现贪吃蛇四方向的移动。 (此图片为最终效果) 原代码预览 我们之前的代码是通过…

6.模拟电子技术——共集电极,共基极,多极放大电路

写在前面 这个是第六次的笔记,祝大家学习愉快 笔记部分 1.共集电极放大电路 首先,我们再复习一遍组态判断:基极进,发射极出,说明是共集电极放大电路。可能读者已经知道一些结论,先抛开这些,我…

Kubernetes-环境篇-02-ubuntu开发环境搭建

1、ubuntu基础环境 # 更新apt软件源 sudo apt update# 安装git sudo apt install git# 安装python3 sudo apt install -y python3 python3-pip# 安装vim sudo apt install vim2、安装go 2.1 下载go安装包 wget https://golang.google.cn/dl/go1.23.2.linux-amd64.tar.gz2.2 …

第十二届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(第一套)

一.题目分析 (1).题目 (2).题目分析 1.串口功能分析 a.串口接收车辆出入信息:通过查询车库的车判断车辆是进入/出去 b.串口输出计费信息:输出编号,时长和费用 c.计算停车时长是难点&#x…

深度学习-----------------机器翻译与数据集

目录 机器翻译与数据集下载和预处理数据集预处理步骤词元化词汇表该部分总代码 固定长度阶段或填充该部分总代码 转换成小批量数据集用于训练训练模型总代码 机器翻译与数据集 import os import torch from d2l import torch as d2l下载和预处理数据集 #save d2l.DATA_HUB[fr…

被字节恶心到了

字节 日常逛 xhs 看到一篇吐槽贴,表示被公司恶心到了: 这位网友表示,最近是公司举办了 Q2 和 H1 的优秀员工表彰,自己的 1(直属领导)评上了,但仔细一看,1 获奖的所有产出都是自己的&…

sql注入第7关(学习记录)

看到这里好像和前面的不一样了,多了个use outfile 先输入个符号,看报错,还是得看别人的教程,通过查找,好像要通过图片来进行注入,ok呀,又是新的方式, 首先我们需要知道他的闭合方式…

uniapp+Android智慧居家养老服务平台 0fjae微信小程序

目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 老年人 登…

算法 | 鹈鹕算法POA-Transformer-LSTM多变量回归预测

🔥 内容介绍 近年来,随着大数据时代的到来和计算能力的飞速提升,对复杂系统进行精确预测的需求日益增长。多变量时间序列预测作为一项关键技术,广泛应用于金融、能源、交通等诸多领域。传统的预测方法,例如ARIMA和多元…

Prometheus Metrics和PromQL的使用

Metrics 官方解释是 Metrics are numerical measurements in layperson terms. (通俗地讲,Metrics就是数字测量) Prometheus fundamentally stores all data as time series (Prometheus把所有数据都存储为时间序列) Every time series is u…

《PMI-PBA认证与商业分析实战精析》第6章 跟踪与监督

第6章 跟踪与监督 本章主要内容包括: 跟踪 关系与依赖性 批准需求 基线化已批准需求 使用跟踪矩阵来监督需求 需求生命周期 管理需求变更 本章涵盖的考试重点: 跟踪与监督的六项活动 跟踪与监督六项活动的可交付成果及活动间的关系 跟踪的定义…

指南:Linux常用的操作命令!!!

引言: 操作系统是软件的一类。 主要作用是协助用户调度硬件工作,充当用户和计算机硬件之间的桥梁。 尽管图形化是大多数人使用计算机的第一选择,但是在Linux操作系统上多数都是使用的:命令行在开发中,使用命令行形式&#xff0c…

【有啥问啥】联邦学习(Federated Learning, FL):保护隐私的分布式机器学习

联邦学习(Federated Learning, FL):保护隐私的分布式机器学习 联邦学习(Federated Learning, FL)作为一种前沿的分布式机器学习技术,正逐步成为解决数据隐私保护与模型性能提升之间矛盾的关键方案。以下是…

HTTP Cookie与Session

目录 一. 引入Cookie 1.1 定义 1.2 工作原理 1.3 分类 二. 认识Cookie 三. 测试Cookie 五. 引入Session 六. 测试Session 这篇博客,我们来看看Cookie与Session,内容干货满满。 一. 引入Cookie 1.1 定义 HTTP Cookie&…

幂等性及技术解决方案

目录 定义幂等性 为什么需要幂等性幂等性设计注意事项幂等性的范围分布式锁解决幂等性 设计 延伸阅读 定义幂等性 简单地说,我们可以多次执行幂等运算而不改变结果或者使用相同的输入参数中被调用多次,则不具有额外效果的操作,也就是多次执…

使用pytdx获取历史股票行情

使用pytdx获取历史股票行情 先看效果pytdx基础获取历史股票行情将历史数据存入数据库 先看效果 获取从2010年01月01日-2024年09月30日的股票数据 pytdx基础 https://blog.csdn.net/firexiaHouse/article/details/142687052?spm1001.2014.3001.5501 获取历史股票行情 def …

C++11--智能指针

引入 为什么需要智能指针? 在介绍异常时,遇到以下场景,处理异常就会比较棘手: void Func() {int* arr1 new int[10];int* arr2 new int[20];int* arr3 new int[30];// ...delete[] arr1;delete[] arr2;delete[] arr3; }这里…

一文吃透 SpringBoot (从入门到精通)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

15分钟学 Python 第35天 :Python 爬虫入门(一)

Day 35 : Python 爬虫简介 1.1 什么是爬虫? 网页爬虫(Web Crawler)是自动访问互联网并提取所需信息的程序。爬虫的主要功能是模拟用户通过浏览器访问网页的操作,从而实现对网页内容的批量访问与信息提取。它们广泛应用于数据收集…