Linux网络 | 理解TCP面向字节流、打通socket与文件的关系

devtools/2025/2/5 15:10:37/

        前言:我们经常说TCP是面向字节流的, TCP是面向字节流的。 但是, 到底是什么事面向字节流呢? 另外, 我们知道sockfd其实就是文件fd。 但是,为什么sockfd是文件fd呢? 这些问题都在本节内容中的到回答, 同时外加一些小知识点。现在废话不多说, 开始我们的学习吧!

        ps:本节内容建议即便不熟悉TCP报文报头也可以学习哦!

目录

面向字节流

什么是面向字节流 

面向字节流的问题

TCP连接异常问题

进程终止 

机器重启 

机器掉电,网络断开 

打通socket与文件fd


面向字节流

什么是面向字节流 

        由于缓冲区的存在,当我们写100个字节的时候可以一次发送100个字节,也可以发送100次一个字节。我们还可以一次接收100个字节或者接收100次一个字节。

        换句话说就是由于缓冲区的存在,TCP程序的读和写不需要一一匹配。

        而面向数据报就是类似于我们的发邮件,发快递,就是我们发送端发送了几次报文,接收方就得接收几次报文。并且发多少接受多少。 

 

        就比如上层有四个请求,一个请求40个字节。当应用层将数据发送到内核缓冲区的时候内核
缓冲区不关心有几个报文, 它只关心一共多少个字节。就比如现在是160个字节。然后TCP发送
的时候要做的,就是把这160个字节安全稳定的发送到对面!对方的内核缓冲区也只关心一共有
多少个字节的数据要接收!至于报文有多少,报头和有效载荷分离那是上层用户要关心的,下层不关心。

        这其中,TCP传输层只关心字节的流动,所以叫做面向字节流。 

面向字节流的问题

        用户层才有报文的概念,我们发送方是发送多个请求, 接收方就是对报文一个一个的处理
将字节流变成一个一个的请求。这个时候就有数据报粘包问题。

        什么是数据粘包问题——当上层进行读取时,如果不对报文进行一个一个的分离,就可能会多处理或者少处理请求,这种情况, 叫做数据报粘包问题。 

        这个数据报粘包问题, 是相对于用户层的概念。解决粘报: 定协议。
        这个定协议其实就是我们在写tcp协议序列化反序列化的时候那个encode和decode。encode和decode的目的就是为了解决粘报问题。

        所以, 我们以后如何解决数据报的粘报问题?——核心思想就是明确报文和报文之间的边界。

  •         1、定长报文
  •         2、使用特殊字符。就比如今天的报文没有换行符。 所以为了区分报文与报文,我们就可以使用 n来进行区分
  •         3、使用自描述字段 + 定长报头
  •         4、使用自描述字段 + 特殊字符

        所以,面向字节流衍生出了数据报粘报问题,为了解决这个问题,就要使用特定的方案。

TCP连接异常问题

进程终止 

        我们的客户端假设此时和服务端三次握手建立了链接,但是此时客户端突然终止了。那么链接要怎么样?这里我们就要知道,链接和进程 (客户端服务器)之间本身没什么关系,链接和文件是直接相关的。但是我们曾经讲过文件生命周期是随进程的。 所以链接本质是随进程的。
        所以, 结论就是: 对于一个进程来说,它是正常退出还是异常退出, 对于操作系统来说都是退出。那么进程终止, 链接就要断开。就要进行四次挥手。 即: 链接正常自动断开。 

机器重启 

        当我们进行关机的时候,是不是所有的进程都要先关闭? windows有的时候就会问我们是否关闭这些进程,所以,关机的时候,就要先杀掉所有的进程。对于tc来说, 本质也是要断开连接。

机器掉电,网络断开 

        客户端一旦将网线拔掉,客户端时没有机会向服务器中进行四次挥手。因为报文发不出去了。所以服务器不知道客户端已经挂了,他的链接是正常维护的。当客户端再重新联网, 就要重新进行连接,这也是认知不一致问题。

        当服务端发现客户端长时间不发消息,也不回。那么服务端也不能一直保持连接,这就用到了一个叫做:保活机制。 就是一旦时间太长,那么服务端就要认为客户端断开连接了, 就要将连接断掉。 

打通socket与文件fd

        这是我们的进程: 

          

        假如此时打开了一个文件struct file。然后struct file对象里面包含了函数方法以及缓冲区(对于网络来说不重要)以及一个函数指针:private_date。

 

        当我们创建网络套接字时,在我们的操作系统当中,会为我们创建很多数据结构,其中一个就叫做socket 。那private.data就会指向socket这个文件。

        这个socket结构体里面也有一个变量file,能够回指向我们的网络文件。

        所以,在我们的进程层面上,我们只需要利用fd找到对应的文件,就能找到对应的socket全部信息。

        然后这里有一个wait等待队列,这个就是当我们的网络不就虚的时候,就将改网络文件连接到等待队列里。

        socket结构体也有对应的成员函数,也就是说struct file和socket都有自己的方法集。 

 

        sock也是一个重要的属性。 这个sk指针就是指向的sock,这个sock是UDP或者TCP协议结构体的一个成员。什么意思?意思就是说UDP和TCP本身还有一个关于sock的结构体。即udp_sock和tcp_sock。然后,实际上在我们创建tcp套接字时,在底层其实创建的tcp_sock,在我们创建tcp套接字时,在底层其实创建的是udp_sock;然后sock指向的其实是udp_sock或者tcp_sock里面的sock结构体。

        那么他怎么知道指向的时udp或者tcp呢? 其实sock当中有一个lag,区分socket类型
以后,想要访问某一个字段,比如是tcp访问字段,只需要(struct tcp.sock*sk->???就行了。所以,其实这个sk的本质,就是多态。

         我们以前学习文件管理的时候知道struct fle里面的op其实是指向的是网卡的一堆方法。然后soket里面又有网络相关方法。这两个有什么区别呢?
        这个file里面的op其实是对上的,上层数据交给下层。 然后socket里面的op是对下的。

         所以协议栈, 其实就是用特定数据结构表述的协议,用特定协议匹配的方法集合!!!

        服务器收到多个报文,而报文是要被管理的。如何管理呢? 用的是一个sk_buff的结构体进行描述。这个结构体里面有head, data, tail, end。其中head指针就是指向报头的指针。当这个结构体向上或者向下的过程中, 就是报斗指针的向下或者向的过程即封装和解包,本质只要移动指针就可以。

 

 ——————以上就是本节全部内容哦, 如果对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!!    


http://www.ppmy.cn/devtools/156302.html

相关文章

如何安装PHP依赖库 更新2025.2.3

要在PHP项目中安装依赖,首先需要确保你的系统已经安装了Composer。Composer是PHP的依赖管理工具,它允许你声明项目所需的库,并管理它们。以下是如何安装Composer和在PHP项目中安装依赖的步骤: 一. 安装Composer 对于Windows用户…

解锁C/C++:链表数据结构的奇幻之旅

目录 一、引言二、链表基础概念2.1 链表是什么2.2 链表的类型三、C 语言实现链表3.1 定义链表节点3.2 创建链表3.3 链表操作3.3.1 遍历链表3.3.2 插入节点3.3.3 删除节点3.3.4 查找节点3.4 完整示例代码四、C++ 实现链表4.1 定义链表节点类4.2 创建链表4.3 链表操作4.3.1 遍历链…

proxmox创建虚拟机

概述: proxmox服务器已经搭建完成从Proxmox VE开始:安装与配置指南,下面准备搭建一下自己的实验环境。创建虚拟机是第一步,因此本篇博客将详细介绍如何在 Proxmox 上创建虚拟机,包括通过控制台高效地创建虚拟机和使用…

MVC 文件夹:架构之美与实际应用

MVC 文件夹:架构之美与实际应用 引言 MVC(Model-View-Controller)是一种设计模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种架构模式不仅提高了代码的可维护性和可扩展性,而且使得开发流程更加清晰。本文将深入探讨MVC文…

开源2+1链动模式AI智能名片S2B2C商城小程序:突破流量与创意困境的新路径

摘要:本文深入剖析当前互联网行业中流量集中于巨头以及创意边际效应递减的困境,并探讨开源21链动模式AI智能名片S2B2C商城小程序在应对这些困境时所展现的独特优势与应用策略。通过对行业现状的分析以及该小程序功能特点的研究,旨在为企业在艰…

【Proteus】NE555纯硬件实现LED呼吸灯效果,附源文件,效果展示

本文通过NE555定时器芯片和简单的电容充放电电路,设计了一种纯硬件实现的呼吸灯方案,并借助Proteus仿真软件验证其功能。方案无需编程,成本低且易于实现,适合电子爱好者学习PWM(脉宽调制)和定时器电路原理。 一、呼吸灯原理与NE555功能分析 1. 呼吸灯核心原理 呼吸灯的…

【大模型LLM面试合集】大语言模型架构_llama系列模型

llama系列模型 1.LLama 1.1 简介 Open and Efficient Foundation Language Models (Open但没完全Open的LLaMA) 2023年2月,Meta(原Facebook)推出了LLaMA大模型,使用了1.4T token进行训练,虽然最大模型只有65B&…

基于开源AI智能名片2 + 1链动模式S2B2C商城小程序视角下的个人IP人设构建研究

摘要:本文深入探讨在开源AI智能名片2 1链动模式S2B2C商城小程序的应用场景下,个人IP人设构建的理论与实践。通过剖析个人IP人设定义中的“诉求”“特质”“可感知”三要素,结合该小程序特点,阐述其对个人IP打造的影响与推动作用&…