[网络] TCP协议是什么?套接字Socket是什么?它们是什么关系?

news2025/1/22 20:54:18

文章目录

  • 前言
  • TCP协议是什么?
    • IP协议
      • 网络设备才有“门牌号”(IP地址)
      • 网卡、网卡驱动与操作系统的关系
      • 操作系统进程与TCP协议
      • 操作系统进程和Socket套接字
      • 用户进程和Socket套接字
      • 用户进程如何消费Socket套接字文件里的数据?
    • TCP协议与Socket的区别?
    • 用户进程接收和发送网络数据的过程
    • Socket文件与TCP连接数
  • 结语

前言


对于TCP协议、套接字Socket,相信我们大部分人对这两个东西或多或少都有耳闻,并且可能会认为它俩就是同一个东西,这实际是一个比较常见的误区,笔者将用本文去梳理TCP与Socket相关的知识来带你了解什么是TCP什么是套接字。

TCP协议是什么?


TCP,全称Transmission Control Protocol,中译传输控制协议。和IP协议、JSON格式啊等等一切网络相关的一样,是由IETF组织(Internet Engineering Task Force)在rfc系列里定义的一个网络协议标准。

TCP位于网络层协议IP协议之上。和UDP协议同层次。虽然这么介绍了,但依然难以理解对不对?
如果想要理解TCP协议,那么理解IP协议就是有必要的。我们需要先理解一下IP协议是什么?意味着什么?才能帮助我们更好地理解TCP协议。

IP协议

IP,全称Internet Protocol,中译互联网协议,通常被称为IP协议。是IETF组织定义的网络层的协议。

IP协议为我们某个网络下的每个网络设备都规定门牌号(IP地址)以及寻址&路由的规则,这样我们就能通过众多网络设备去找到拥有对应的IP地址的网络设备去“投递”数据。

网络设备才有“门牌号”(IP地址)

前面我们提到了IP协议是给网络设备规定了门牌号,这是什么意思呢?

笔者的意思是PC本身不算网络设备,是没有网络地址的。PC里的 网卡才算是网络设备,有IP地址。那么其实我们通过IP协议传递数据的时候呢,更多的时候是投递到网卡这个硬件上的

网卡这个我们熟悉的网络硬件设备,更像是我们PC在网络中的邮政局,用于接收和发送数据。

网卡、网卡驱动与操作系统的关系

上面一节我们提到了网卡这个网络硬件设备其实是网络数据收发的起始点,IP地址可以说定位的就是我们的网卡。数据发送至网卡这个硬件设备之后,通常这些个数据需要被操作系统进一步处理。

但是网卡硬件设备的生产商有很多,每一家可能都有不同的指令,那么我们的操作系统(进程)不可能知道如何去和所有种类的网卡硬件做数据交互,于是就有了一种类似Java SPI的委托机制:网卡驱动程序

网卡驱动程序几乎都是由网卡硬件生产商所开发和提供的。有了这些网卡驱动程序,我们的操作系统进程(OS进程)就可以和对应网卡做数据交互了。

操作系统进程与TCP协议

上节我们知道了操作系统可以利用网卡驱动程序从网卡存取数据。那么TCP协议呢,其实就是一种对于从网卡硬件设备取来数据后,如何进一步处理的一种规范。这个规范指引了我们如何实现一个能保证数据传输完整性的传输层组件,实现了TCP协议的组件被称为TCP Peer,笔者本文称其为TCP通信组件,其保证数据传输完整性是通过数据承认和重传机制(acknowledge & retransmit) 来实现的,相对的,同处传输层的UPD协议没有这个机制,所以利用基于UPD协议实现的传输层组件呢,就无法保证数据传输的完整性。这个本文不作深入讨论,如果笔者有兴趣可以搜索关键字:TCP Sequence Number。

简单来说操作系统利用TCP通信组件,可以 取到完整的外部网络数据向外部发送完整的网络数据

操作系统进程和Socket套接字

通过上节,我们知道了操作系统进程内部有实现了TCP协议的组件,通过这个组件能收发“完整”的数据,那么我们都知道这些完整的数据,不可能无限制的存储在我们操作系统进程的内存空间之中。这些数据必须要存储到某个地方,那么廉价地存储方式是什么呢?诶,没错就是硬盘了。

我们操作系统进程通过TCP组件取到完整数据之后,会把数据存储到硬盘之中。既然是存储到硬盘之中,那就一定会规定文件格式,那么在网络IO之中呢,这种文件被称为Socket,也就是大名鼎鼎的套接字了,所以Socket套接字本质是个特殊的文件,用于存储来自网络的数据。

用户进程和Socket套接字

通过上节,我们知道了操作系统通过TCP组件最终把来自网络的数据放到了socket套接字文件之中,那么这些socke套接字文件里的数据需要有其消费者对不对?

聪明的读者一定已经猜到,这里的数据消费者,就是我们的用户进程了,就比如大家开发的Web应用程序、rpc服务的消费者程序和提供者程序、HTTP Restful API服务器程序等等。

用户进程如何消费Socket套接字文件里的数据?

通过上节,我们知道了用户进程是会从Socket套接字文件里消费数据的。那么如何消费数据呢?
这涉及到文件IO了对不对?那么操作系统层面提供了文件IO的支持。大部分操作系统,都提供了如bio、nio文件io功能(系统库)。

所以如果你使用偏底层语言如C、C++之类的,你如果想消费Socket文件里的数据,通常是通过调用系统库接口来实现,如大名鼎鼎的epoll等等。
如果你使用高级编程语言如Java,你如果想消费Socket文件里的数据,可以使用JDK里特定的类,这些类呢通过JNI(Java Native Interface)调用C、C++编写的方法,这些方法里依然是通过调用系统库接口来实现的,不过是被包装了一层而已。

TCP协议与Socket的区别?


读到这里,相信大家已经能够理解:

  1. TCP协议是一个标准,通常由操作系统根据这个TCP协议标准开发通信组件,这个通信组件被操作系统管理,其数据的上下游分别是Socket套接字和网卡。

  2. Socket是一个文件,操作系统通过TCP通信组件(TCP Peer)收发数据,接收到的数据会放到Socket文件里,用户进程则通过操作系统提供的文件IO接口,从Socket文件里读写数据。

至此,我们应该能对网络数据的接收过程大致有一个比较全面的理解了。

用户进程接收和发送网络数据的过程

在本节,笔者简单地展示一下用户进程是如何接收和发送网络上的过程。参考下图:

  • 接收数据:网卡 → 网卡驱动 → OS进程里的TCP通信组件 → Socket文件 → 用户进程
  • 发送数据:用户进程 → Socket文件 → OS进程里的TCP通信组件 → 网卡驱动 → 网卡
    在这里插入图片描述

Socket文件与TCP连接数

通过上一章节我们也看到,用户进程可以打开不止一个Socket文件,在TCP的工作流程里,TCP连接与Socket文件与TCP端口是一一对应的。这意味着如果一个接近终端用户服务器在被大量外部用户同时连接时,6万多个TCP连接资源会非常容易耗尽,这也是为什么我们需要做服务器集群的原因之一。当然这是与终端用户最接近的服务器通常会面临的问题,企业内部服务器(位于内网的服务器)则一般不会面对TCP连接资源耗尽的问题。

结语


TCP协议是当今互联网最重要的基础设施之一,正确理解TCP协议与操作系统进程、Socket文件、网卡和用户进程之间的关系,对于帮助我们去理解当今越来越复杂的企业系统架构会非常有帮助。

本文是一篇类似于杂谈的文章,操作系统种类繁多,笔者无法去验证所有实现细节,希望笔者们带着批判的去阅读本文。如果有错误的地方,也希望大家帮忙指正。

我是虎猫,希望本文对你有帮助。(=・ω・=)

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

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

相关文章

呼吸系统药物--平喘药

急性哮喘和慢性哮喘 支气管哮喘属于慢性病。 急性哮喘指支气管哮喘的急性发作,一般在凌晨4点~7点间发作,伴有咳嗽、咳痰、胸闷、气喘和哮鸣音。(用短效、能快速起效的药物治疗,沙丁胺醇喷雾剂(β2受体激动药&#xf…

学习JavaScript进阶

JavaScript进阶 循环语句 for循环 // 类似python中的for i in range(20)for(let i0; i<20; i){console.log(i) }while循环 const MAX_TIMES 20; let cur 0 while (cur < MAX_TIMES){cur;console.log(cur) }do while do {cur ;console.log(cur); }while (cur < MAX_…

【前端开发】CSS BEM命名规范

目录1、BEM2、实战BlockElementModifier3、总结1、BEM BEM其实是块&#xff08;block&#xff09;、元素&#xff08;element&#xff09;、修饰符&#xff08;modifier&#xff09;的缩写&#xff0c;利用不同的区块&#xff0c;功能以及样式来给元素命名。 通过bem规范来命名…

2. Composition API

Composition API 1.Composition API 接下来我们来介绍一下Vue3中新增的Composition API如何使用。注意Composition API仅仅是Vue3中新增的API&#xff0c;我们依然可以使用Options API。先来实现一下之前演示的获取鼠标位置的案例。做这个案例之前&#xff0c;需要先介绍一下…

Java项目:洗浴中心管理系统(java+SSM+JSP+jQuery+javascript+Mysql)

源码获取&#xff1a;俺的博客首页 "资源" 里下载&#xff01; 项目介绍 本项目分为前后台&#xff0c;包含普通用户与管理员两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,管理员信息管理,查看用户信息,新闻公告管理,产品类型管理,级别信息…

物联网开发笔记(53)- 使用Micropython开发ESP32开发板之蓝牙BLE通信

一、目的 这一节我们学习如何使用我们的ESP32开发板通过蓝牙和手机进行通信。 二、环境 ESP32 手机&#xff08;笔者用的小米10&#xff09; Thonny IDE 三、蓝牙介绍 这个知识大家自行百度吧&#xff0c;这里不再赘述什么是蓝牙和蓝牙的历史&#xff0c;以及相关的专业知识…

JS(第二十六)ES6语法中function

JS(第九课)深刻的去理解函数._星辰镜的博客-CSDN博客 1 Function函数的定义 方式1 函数声明方式 function 关键字 (命名函数) function fn(){} 方式2 函数表达式(匿名函数) var fn function(){} 方式3 new Function() var f new Function(a, b, console.log(a b)); f(1, …

Tomcat服务器和Web开发介绍

Tomcat服务器和Web开发介绍 一、开启Web开发 什么是web开发 WEB&#xff0c;即网页的意思&#xff0c;它用于表示Internet主机上供外界访问的资源。 Internet上供外界访问的Web资源分为&#xff1a; 静态web资源&#xff08;如html 页面&#xff09;&#xff1a;指web页面中供…

数据挖掘期末复习

考点目录 文章目录考点目录复习准备1. 数据挖掘的标准流程2. 数据挖掘的主要功能3. 数据探索的主要内容及其意义数据质量分析1.异常值分析2.缺失值分析数据特征分析1.分布分析6.相关性分析4. 数据预处理的作用及其主要任务5. 常见的噪声处理方法6.常用的缺失值处理方法7. 常用的…

Map和Set的详解

Map和Set是一种专门用来搜素的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关&#xff0c;是一种适合动态查找的集合容器 一、模型 一般把搜索的数据称为关键字&#xff08;Key&#xff09;&#xff0c;和关键字对应的称为值&#xff08;Value&#xff09;…

Teams Tab App 的 manifest 分析

上一篇文章我们深入来分析了 tab app 的代码&#xff0c;这篇文章我们研究一下 manifest。 Teams 的 manifest 实际上是一个很复杂的 json&#xff0c;里面的配置非常多&#xff0c;之前的文章陆陆续续的讲过一些配置&#xff0c;我们在这篇文章里来看看关于 tabs 的一些配置&…

链表之删除单链表中的重复节点

文章目录删除单链表中的重复节点题目描述解题思路代码实现删除单链表中的重复节点 力扣链接 题目描述 编写代码&#xff0c;移除未排序链表中的重复节点。保留最开始出现的节点。 示例1:输入&#xff1a;[1, 2, 3, 3, 2, 1]输出&#xff1a;[1, 2, 3]示例2:输入&#xff1a;…

WEB网站安全检测系统设计与实现

目 录 1 引言 1 2 Web服务器所受的威胁及防御 1 2.1 缓冲区溢出 1 2.2 SQL注入攻击 1 2.3 基于脚本的DDos攻击 2 2.4 其他的不安全因素 3 3 Web的木马检测系统的设计 4 3.1 体系结构 4 3.2 处理流程 5 3.3 对客户端访问的响应 7 3.4 策略引擎的设计 8 3.4.1 策略的属性 8 3.4.2…

9、软件包管理

文章目录9、软件包管理9.1 RPM9.1.1 RPM 概述9.1.2 RPM 查询命令&#xff08;rpm -qa&#xff09;9.1.3 RPM 卸载命令&#xff08;rpm -e&#xff09;9.1.4 RPM 安装命令&#xff08;rpm -ivh&#xff09;9.2 YUM 仓库配置9.2.1 YUM 概述9.2.2 YUM 的常用命令9.2.3 修改网络 YU…

Linux系统中基本的启动方式

大家好&#xff0c; 今天主要和大家聊一聊&#xff0c;Linux系统的启动方式有哪些&#xff1f; 目录 第一&#xff1a;启动方式基本简介 第二​&#xff1a;启动模式的选择 第一&#xff1a;启动方式基本简介 Linux系统支持多种启动方式&#xff0c;可以从SD/EMMC、NAND Flas…

Jumperserver堡垒机管理服务器实战

一、 Jumpserver堡垒机简介 1、跳板机简介 跳板机就是一台服务器,开发或运维人员在维护过程中首先要统一登录到这台服务器,然后再登录到目标设备进行维护和操作。 跳板机缺点:没有实现对运维人员操作行为的控制和审计,使用跳板机的过程中还是会出现误操作、违规操作导致的…

Vue实现角色权限动态路由详细教程,在vue-admin-template基础上修改,附免费完整项目代码

前言 vue-admin-template是一个最基础的后台管理模板&#xff0c;只包含了一个后台需要最基础的东西&#xff0c;如果clone的是它的master分支&#xff0c;是没有权限管理的&#xff0c;只有完整版vue-element-admin有这个功能&#xff0c;但是为了小小的一个权限管理而用比较…

java框架 Spring之 AOP 面向切面编程 切入点表达式 AOP通知类型 Spring事务

AOP(Aspect Oriented Programming)面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构 作用&#xff1a;在不惊动原始设计的基础上为其进行功能增强 Spring理念&#xff1a;无入侵式/无侵入式 我们在不修改源代码的时候&#xff0c;为了执行另外的…

idea如何快速找到项目中对应的类(包括源码)

文章目录1. 前言2. 先说结论3. idea的全局搜索功能 MethodValidation4. 搜索spring源码(例子)1. 前言 最近在看某些功能的时候&#xff0c;会去看对应的源码&#xff0c;而有时候只知道类名&#xff0c;不知道从哪里进入源码&#xff0c;因此就比较好奇&#xff0c;idea的全局…

JAVA类加载器

JAVA是一种解释型语言&#xff0c;也就是一种边解释边执行的语言。JAVA所有源代码在执行之前&#xff0c;先要被编译成class文件&#xff0c;然后类加载器加载解析class文件&#xff0c;最后才执行。 JVM自带了几个类型的类加载器&#xff0c;JVM使用分层的软件架构方式设计类…