Linux网络基础 (二) ——(IP、MAC、端口号、TCPUDP协议、网络字节序)

2024-04-15 08:28

本文主要是介绍Linux网络基础 (二) ——(IP、MAC、端口号、TCPUDP协议、网络字节序),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • IP 地址
    • 基本概念
    • 源IP地址 & 目的IP地址
  • MAC 地址
    • 基本概念
    • 源MAC地址 & 目的MAC地址
  • 端口号
    • 基本概念
    • 源端口号 & 目的端口号
  • TCP & UDP 协议
    • 基本概念
    • TCP 与 UDP 的抉择
  • 网络字节序
    • 大端、小端字节序

🎖  博主的CSDN主页:Ryan.Alaskan Malamute
📜 博主的代码仓库主页 [ Gitee ]:@ryanala      [GitHub]: Ryan-Ala

IP 地址

基本概念

  • 在 TCP/IP 网络通信时,为了保证能正常通信,每个设备都需要配置正确的 IP 地址,否则无法实现正常的通信。IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。

  • IP地址采用点分十进制的标记方式,将 32 位 IP 地址以每 8 位为组,共分为 4 组,每组以「.」隔开,再将每组转换成十进制。例如:192.168.42.137

  • IP 地址最大值也就是 232 = 4294967296 ,即最大允许 43 亿台计算机连接到网络。但是以现在的网络的发展,通信设备的增加,IPv4 的地址是完全不够用的。但 IP 地址并不是根据主机台数来配置的,而是以网卡来配置的。服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址,所以是不可能让43亿台计算机全部联网。

那么如何解决这个问题?

  1. 动态分配
    使用 动态分配 IP 地址:就是当有设备联网的使用分配一个 IP 地址给当前设备,如果当前设备不联网了,那么就不分配。但是这种方案是治标不治本的;
  2. NAT机制
    使用 NAT 机制:把 IP 分为 外网 IP内网 IP,用一个 外网 IP 代替 N 个内网 IP。

    举个例子
    在送快递时,收货地址填写学校,而学校里有很多人,每个人用姓名和手机号区分。那么网络也是如此,进入内网 IP 后则是使用 端口号 区分。

  3. 使用IPv6
    使用能够表示更多IP地址的IPv6 解决这个问题,这里不再过多展开

源IP地址 & 目的IP地址

在网络编程中不同主机间进行进程通信需要有IP地址分为源IP地址目的IP地址

  • 源IP地址: 表示该条信息来源于哪个机器。
  • 目的IP地址:表示该条信息去往于哪个进程。

在这里插入图片描述

  以太网上的每台计算机都有一个唯一的IP地址,假如一台主机上的数据要传输到另一台主机,那么发送信息的主机IP就是源IP地址,而接收这条信息的对端主机的IP地址就为目的IP地址。
  但网络通信是极其复杂的,在信息的交互过程中仅仅知道目的IP地址是不够的,当对端主机收到该数据后,对端主机还需要对该主机做出响应,因此对端主机也需要发送数据给该主机,此时对端主机就必须知道该主机的IP地址。因此一个传输的数据当中应该涵盖其源IP地址和目的IP地址,目的IP地址表明该数据传输的目的地,源IP地址作为对端主机响应时的目的IP地址。

  这两个地址在数据传输过程中基本是不会发生变化的(存在一些特殊情况,比如在数据传输过程中使用NET技术,其源IP地址会发生变化,但至少目的IP地址是不会变化的)

  在数据进行传输之前,会先自顶向下贯穿网络协议栈完成数据的封装,其中在网络层封装的IP报头当中就涵盖了源IP地址和目的IP地址。而除了源IP地址和目的IP地址之外,还有源MAC地址和目的MAC地址的概念。

MAC 地址

基本概念

Mac地址(英语:Media Access Control Address),称为局域网地址,Mac地址用于确认一个网络设备位置的位址

  • Mac地址也称物理地址,硬件地址,是网络硬件(如无线网卡或以太网卡)分配的唯一地址
  • 在ISO模型中,第三层网络层负责IP地址,第二层链路层负责Mac位址
  • Mac地址为六组两位字符组成,由冒号分隔,例:00:A4:31:3A:1B:B7
  • Mac地址用于在网络中标识一个唯一的网卡,一台设备如果由一个或者多个网卡,则每张网卡都需要有一个唯一的MAC地址

示例:
在这里插入图片描述

源MAC地址 & 目的MAC地址

  大部分数据的传输都是跨局域网的,数据在传输过程中会经过若干个路由器,最终才能到达对端主机。

  源MAC地址和目的MAC地址是包含在链路层的报头当中的,而MAC地址实际只在当前局域网内有效,因此当数据跨网络到达下一个局域网时,其源MAC地址和目的MAC地址就需要发生变化,因此当数据达到路由器时,路由器会将该数据当中链路层的报头去掉,然后再重新封装一个报头,此时该数据的源MAC地址和目的MAC地址就发生了变化。

再举个送快递的例子:
假如此时你买了一个快递,其发货地是江苏省南京市XXX街道105号,收货地是浙江省宁波市东部新城XXX路231号,那么此时途中需要经过 苏州站——杭州站——宁波站,这里的每一站就相当于是数据在以太网传送过程中的MAC地址

因此数据在传输的过程中是有两套地址:

  1. 源IP地址和目的IP地址,这两个地址一般情况下在传送过程中不会发生改变
  2. 源MAC地址和目的MAC地址,这两个地址是一直在发生变化的,数据每一次到达下一个路由器就会去掉之前的MAC地址,转而加上新的MAC地址

端口号

基本概念

  端口号的主要作用是表示一台计算机中的特定进程所提供的服务。一台计算机上可以同时提供很多个服务,如数据库服务、FTP服务、web服务等,我们就通过端口号来区别相同计算机所提供的这些不同的服务

端口号(port)是传输层协议的内容

  • 端口号是一个2字节16位的整数
  • 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理
  • IP地址 + 端口号 能够标识网络上的某一台主机的某一个进程
  • 一个端口号只能被一个进程占用

按端口号可分为2大类:

  1. 公认端口(Well-KnownPorts):范围从0到1023。

  2. 动态端口(Dynamic Ports):范围从1024到65535

源端口号 & 目的端口号

由于IP地址能够唯一标识公网内的一台主机,而端口号能够唯一标识一台主机上的一个进程,因此用IP地址+端口号就能够唯一标识网络上的某一台主机的某一个进程

当数据在传输层进行封装时,就会添加上对应源端口号和目的端口号的信息

  1. 通过源IP地址+源端口号就能够在网络上唯一标识发送数据的进程
  2. 通过目的IP地址+目的端口号就能够在网络上唯一标识接收数据的进程

这样就实现了跨网络的进程间通信。

注意一个进程可以绑定多个端口号,但是一个端口号不能被多个进程同时绑定。

TCP & UDP 协议

基本概念

  网络协议栈是贯穿整个体系结构的,在应用层、操作系统层和驱动层各有一部分。当我们使用系统调用接口实现网络数据通信时,不得不面对的协议层就是传输层,而传输层最典型的两种协议就是TCP协议和UDP协议。

  1. TCP(Transmission Control Protocol 传输控制协议)

    传输层协议、有连接、可靠传输、面向字节流

    TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。

    TCP协议是面向连接的,如果两台主机之间想要进行数据传输,那么必须要先建立连接,当连接建立成功后才能进行数据传输。其次,TCP协议是保证可靠的协议,数据在传输过程中如果出现了丢包、乱序等情况,TCP协议都有对应的解决方法。

  • UDP(User Datagram Protocol 用户数据报协议)

    传输层协议、无连接、不可靠传输、面向数据报

    UDP协议是一种无需建立连接的、不可靠的、面向数据报的传输层通信协议。

    使用UDP协议进行通信时无需建立连接,如果两台主机之间想要进行数据传输,那么直接将数据发送给对端主机就行了,但这也就意味着UDP协议是不可靠的,数据在传输过程中如果出现了丢包、乱序等情况,UDP协议本身是不知道的。

TCP 与 UDP 的抉择

  • TCP协议是一种可靠的传输协议,使用TCP协议能够在一定程度上保证数据传输时的可靠性,而UDP协议是一种不可靠的传输协议,为什么还要用UDP协议呢?

  • 首先,TCP协议虽然是一种可靠的传输协议,但这意味着TCP协议在需要做更多的工作来保证可靠性,因此TCP协议实现很复杂,TCP协议面向连接虽然可靠,但底层复杂,在传输速率上没有UDP快速。

  • UDP协议虽然是一种不可靠的传输协议,但UDP协议不需要做过多的工作,因此UDP协议实现一定比TCP协议要简单,UDP协议虽不可靠,但是它能够快速的将数据发送给对方。

  • 编写网络通信代码时具体采用TCP协议还是UDP协议,完全取决于上层的应用场景。如果应用场景严格要求数据在传输过程中的可靠性,此时我们就必须采用TCP协议,如果应用场景允许数据在传输出现少量丢包,那么肯定优先选择UDP协议,因为UDP协议足够简单,快速。

网络字节序

大端、小端字节序

  大端 和 小端表示多字节值的哪一端存储在该值的起始地址处,小端存储在起始地址处,即是小端字节序,大端存储在起始地址处,即是大端字节序。

  • 大端字节序(Big Endian):最高有效位存于最低内存地址处,最低有效位存于最高内存处;
  • 小端字节序(Little Endian):最高有效位存于最高内存地址,最低有效位存于最低内存处。

如图:
在这里插入图片描述

  内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?
网络协议约定:

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
  • 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
  • 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
  • TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.
  • 不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
  • 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

这篇关于Linux网络基础 (二) ——(IP、MAC、端口号、TCPUDP协议、网络字节序)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/905324

相关文章

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

ubuntu16.04如何部署dify? 在Linux上安装部署Dify的技巧

《ubuntu16.04如何部署dify?在Linux上安装部署Dify的技巧》随着云计算和容器技术的快速发展,Docker已经成为现代软件开发和部署的重要工具之一,Dify作为一款优秀的云原生应用... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。它

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Linux系统调试之ltrace工具使用与调试过程

《Linux系统调试之ltrace工具使用与调试过程》:本文主要介绍Linux系统调试之ltrace工具使用与调试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、ltrace 定义与作用二、ltrace 工作原理1. 劫持进程的 PLT/GOT 表2. 重定

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1