TCP协议(20250304)

1. TCP

TCP: 传输控制协议(Transmission Control Protocol),传输层协议之一(TCP,UDP)

2. TCP与UDP

UDP(用户数据报协议)

  • 面向数据报
  • 无连接
  • 不安全不可靠(尽最大努力交付)
  • 机制简单,传输效率高

TCP(传输控制协议)

  1. 需要建立连接
  2. 安全、可靠
  3. 面向字节流
  4. 占用资源开销大 

3. 三次握手

        指建立tcp连接时,需要客户端和服务端总共发送三次报文确认连接

4. 四次挥手

        断开一个tcp连接,需要客户端和服务端发送四个报文以确认断开 

TCP编程:基于C/S模型的socket文件进行通信

5. TCP框架设计

  • client: socket--->connect--->send/write--->close
  • server:    socket--->bind--->listen--->accept---> recv/read--->close

6. 函数接口

6.1 socket

        socket(AF_INET, SOCK_STREAM, 0);

6.2 connect

        int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
功能:
        发送三次握手链接请求
参数:
        sockfd:套接字文件描述符
        addr:存放目的地址空间首地址
        addrlen:目的地址长度
返回值:
        成功返回0 
        失败返回-1   

6.3 send

        ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
        发送数据
参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址
        len:数据长度
        flag:属性默认为0 
返回值:
        成功返回发送字节数
        失败返回-1   

6.4 recv

        ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
        接收数据 
参数:
        sockfd:套接字文件描述符
        buf:存放数据空间首地址 
        len:最多接收数据长度 
        flags:接收属性默认为0 
返回值:
        成功返回实际接收字节数
        失败返回-1 
        连接断开返回0 

6.5 bind

        int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);

6.6 listen

        int listen(int sockfd, int backlog);
      功能:
        监听三次握手链接请求
      参数:
        sockfd:套接字文件描述符
        backlog:最多允许等待尚未处理的三次握手链接个数
      返回值:
        成功返回0 
        失败返回-1 

6.7 accept

        int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
        处理三次握手等待队列中的第一个请求并建立一个用来通信的新套接字
参数:
        sockfd:套接字文件描述符
        addr:存放发送端IP地址空间首地址 
        addrlen:想要接收的IP地址的长度 
返回值:
        成功返回新文件描述符
        失败返回-1 

7. TCP粘包

TCP协议是面向字节流的协议,接收方不知道消息的界限,不知道一次提取多少数据,这就造成了粘包问题

产生原因

  • TCP发送数据时,没有及时发走,会根据缓冲区数据的情况进行重新组包
  • TCP接收方,没有及时读走缓冲区数据,导致缓冲区大量数据缓存

解决方案

  • 消息定长法:对于定长的包,保证每次都按固定大小读取即可        //  结构体
  • 添加消息头:在每个数据包前添加固定长度的消息头,消息头中记录数据包的长度等信息。发送方发送数据时,先发送消息头,再发送实际数据。接收方先读取消息头,获取数据包长度信息,再根据该长度读取后续的实际数据
  • 特殊字符分隔法:在数据包之间添加特殊的分隔字符(‘\n’),发送方发送数据时,在每个数据包后加上分隔字符,接收方按分隔字符来分割数据包

8. TCP报文头

标志位:

  • URG: 紧急指针标志, 为1时表示紧急指针有效, 该报文应该优先传送。
  • ACK: 确认应答标志
  • PSH:  表示发送数据,提示接收端从TCP接收缓冲区中读走数据,为接收后续数据腾出空间
  • RST: 重置连接标志
  • SYN: 表示请求建立一个连接
  • FIN: finish标志, 表示释放连接

滑动窗口大小:是TCP流量控制得一个手段。目的是告诉对方,本端的TCP接受缓冲区还能容纳多少字节得数据,这样对方就可以控制发送数据的速度,从而达到流量控制,16bit,因而窗口最大65535

9. TCP机制

保证可靠性的同时又要尽可能的提高性能

可靠性:

  • 三次握手和四次挥手机制
  • 应答机制:TCP将每个字节的数据都进行了编号,即为序列号。每一个ACK都带有对应的确认序列号,保证数据不丢失的按序到达
  • 超时重传:当发送端发送的数据在网络中丢失时,在一定时间内没有收到接收端的ACK,则发送端会重新发送丢失数据。
  • 流量控制:按照ACK中“窗口大小”字段控制发送端的发送速度

提高性能:

  • 滑动窗口:可以按照“窗口大小”, 一次发送多条后, 再等待应答
  • 延迟应答:当接收方处理速度很快时,可以延迟发送ACK,此时"窗口大小"会自动增大
  • 捎带应答:搭载应用层的响应报文发送ACK

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

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

相关文章

NModbus 连接到Modbus服务器(Modbus TCP)

1、在项目中通过NuGet添加NModbus,在界面中添加一个Button。 using NModbus.Device; using NModbus; using System.Net.Sockets; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Docu…

【零基础到精通Java合集】第十八集:多线程与并发编程-线程池与Callable/Future应用

课程标题:线程池与Callable/Future应用(15分钟) 目标:掌握线程池的创建与管理,理解Callable任务与Future异步结果处理机制 0-1分钟:课程引入与线程池意义 以“银行窗口服务”类比线程池:复用固定资源(柜员)处理多任务(客户)。说明线程池的核心价值——避免频繁创建…

【leetcode hot 100 238】除自身以外数组的乘积

解法一:(左右乘积列表)利用索引左侧所有数字的乘积和右侧所有数字的乘积(即前缀与后缀)相乘得到答案。 class Solution {public int[] productExceptSelf(int[] nums) {int len nums.length;int[] L new int[len]; …

BUU44 [BJDCTF2020]ZJCTF,不过如此1 [php://filter][正则表达式get输入数据][捕获组反向引用][php中单双引号]

题目: 我仿佛见到了一位故人。。。也难怪,题目就是ZJCTF 按要求提交/?textdata://,I have a dream&filenext.php后: ......不太行,好像得用filephp://filter/convert.base64-encode/resourcenext.php 耶?那 f…

[Web 安全] PHP 反序列化漏洞 —— POP 链构造思路

关注这个专栏的其他相关笔记:[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 0x01:什么是 POP 链? POP 链(Payload On Purpose Chain)是一种利用 PHP 中的魔法方法进行多次跳转以获取敏感数据的技术。它通常出现在 CTF…

扩散语言模型:从图像生成到文本创造的范式跃迁

近年来,扩散模型(Diffusion Models)在人工智能领域异军突起,尤其在图像生成任务中取得了令人瞩目的成就,如 Stable Diffusion 等模型已成为生成高质量图像的标杆。这种成功激发了研究者们的好奇心:扩散模型的魔力能否从视觉领域延伸至自然语言处理(NLP),为文本生成带来…

大模型工程师学习日记(十):基于 LangChain 构建向量存储和查询 Qdrant

Qdrant介绍 Qdrant(读作:quadrant /kwɑdrənt/ n. 象限;象限仪;四分之一圆)是一个向量相似度搜索引擎。它提供了一个生产就绪的服务,具有方便的 API 来存储、搜索和管理点 - 带有附加载荷的向量。Qdrant专…

DeepSeek 助力 Vue3 开发:打造丝滑的网格布局(Grid Layout)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

deepseek、腾讯元宝deepseek R1、百度deepseekR1关系

分析与结论 区别与联系 技术基础与定制方向: DeepSeek官网R1版本:作为基础版本,通常保留通用性设计,适用于广泛的AI应用场景(如自然语言处理、数据分析等)。其优势在于技术原生性和官方直接支持。腾讯元宝…

外贸独立站使用wordpress模板与定制哪个SEO效果好

使用WordPress模板搭建的外贸独立站与定制站的SEO效果,可以从以下几个方面进行分析: 1. 内容质量是SEO的核心 内容质量确实是SEO的关键,无论使用模板还是定制开发,优质、相关、原创的内容都是提升排名的基础。内容能够解决用户问…

Golang语法特性总结

1.认识Golang代码特性 package main //1.包含main函数的文件就是一个main包--当前程序的包名// import "fmt" // import "time" import("fmt""time" )//3.同时包含多个包 4.强制代码风格:函数的 { 一定和函数名在同一行,否…

AI赋能校园安全:科技助力预防与应对校园霸凌

校园本应是学生快乐学习、健康成长的地方,然而,校园霸凌却成为威胁学生身心健康的隐形“毒瘤”。近年来,随着人工智能(AI)技术的快速发展,AI在校园安全领域的应用逐渐成为解决校园霸凌问题的新突破口。通过…

易语言模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

运营商三要素API:构建安全信任的桥梁

引言 在数字经济时代,身份验证已成为各类业务场景的基础需求。运营商三要素API作为一种高效的身份核验工具,通过对接运营商数据,实现对用户姓名、身份证号码、手机号码三项关键信息的实时校验,为各行业提供可靠的身份认证解决方案…

Spring Boot 与 MyBatis 版本兼容性

初接触Spring Boot,本次使用Spring Boot版本为3.4.3,mybatis的起步依赖版本为3.0.0,在启动时报错,报错代码如下 org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name userMapper…

GCN从理论到实践——基于PyTorch的图卷积网络层实现

Hi,大家好,我是半亩花海。图卷积网络(Graph Convolutional Network, GCN)是一种处理图结构数据的深度学习模型。它通过聚合邻居节点的信息来更新每个节点的特征表示,广泛应用于社交网络分析、推荐系统和生物信息学等领…

MyBatis-Plus 逻辑删除实现

在很多企业级应用中,数据删除操作通常采用 逻辑删除 的方式,而不是物理删除。逻辑删除指的是通过更新字段(例如 is_deleted 或 status)来标记数据为删除状态,而不是真的从数据库中删除记录。这样做的好处是保留数据的历…

STM32_IIC外设工作流程

STM32 IC 外设工作流程(基于寄存器) 在 STM32 中,IC 通信主要通过一系列寄存器控制。理解这些寄存器的作用,能够帮助我们掌握 IC 硬件的运行机制,实现高效的数据传输。本文以 STM32F1(如 STM32F103&#x…

集合遍历的多种方式

目录 1.增强for 2.迭代器(在遍历的过程中需要删除元素,请使用迭代器) 3.双列集合 4.Lambda表达式(forEach方法) 1.单列集合: 2.双列集合: 4.Stream 流 5.普通for循环 6.列表迭代器 7.总结 1.增强for 注&…

DeepSeek在MATLAB上的部署与应用

在科技飞速发展的当下,人工智能与编程语言的融合不断拓展着创新边界。DeepSeek作为一款备受瞩目的大语言模型,其在自然语言处理领域展现出强大的能力。而MATLAB,作为科学计算和工程领域广泛应用的专业软件,拥有丰富的工具包和高效…