【Linux网络编程一】网络基础1(网络框架)

这篇具有很好参考价值的文章主要介绍了【Linux网络编程一】网络基础1(网络框架)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


本篇开始总结网络知识,系统部分到此结束。
网络的本质就是在获取和生产数据,而系统的本质就是在处理数据。从网络中获取到数据利用系统调用来处理数据。而网络的本质也就是文件,我往文件里写,就是往网卡里写,往网卡里写,就是往网络里写。

一.什么是协议

我们在生活中都是基于数据来进行协助的,而一般我们可以根据协议约定,来减少沟通成本。
协议就是一种约定,它的出现是为了解决通信过程中出现的问题,所以我们只要理解了通信过程会出现什么样的问题,就能清楚要制作什么样的协议,那么通信过程中存在哪些问题呢?

1.通信问题

【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php
在两台主机网络通信过程中,面临着以下四种问题:

【问题1】.你怎么保证你的数据能准确的到达下一个设备?
【问题2】.你如何定位的到要发送的主机位置呢?
【问题3】.长距离传输过程中数据会不会丢失呢?
【问题4】对方接收到数据,就算完了吗?如何处理发来的数据呢?

通信的两台主机都会面临着相同的问题,为了解决这些通信问题,所以就需要制定对应的协议来解决。
问题1由以太网协议解决
问题2由ip协议来解决
问题3由tcp协议来解决
问题4由应用层协议来解决。

2.协议本质

在我们日常生活中,类似于协议的东西有很多,就比如我们接收快递时,我们想要的是买的物品本身,但商家默认会将一个快递盒子发给我们,并且外面还贴有标签(收件人,手机)等信息。这个快递盒子和标签就是协议!

1.所以我们在接收快递时,我们会收到除了快递本身之外的更多信息字段,比如快递盒子外面贴的标签,这个多出来的信息字段,就是协议,严格上说是协议的报头!
2.事实上,在我们日常发送数据时,也不是单单就把数据发送过去,我们一定还会在我们要发送的数据之外多发送一些东西,这个多出来的,就是协议!
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

这个多出来的东西,就是一些信息字段,描述某些特征,而在计算机当中,结构体恰好就是用来描述对象的一些基本信息和属性,所以在计算机中,协议的表现形式就是结构体对象!

所以一台主机发送一个结构体对象,另一台主机是可以立马认识到这个结构体表示什么意思,因为该主机也有该类的源代码,结构体对象类型是一样的,所以我们就可以跨逐渐上让它们基于结构体快速形成约定,这就是协议!
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

3.网络协议标准

【问题】那么两台主机如果要网络通信,只要约定好协议就可以了吗?

协议是定制设置出来的一种形式,但协议代表的含义也是定制者赋予的,所以除了协议形式要统一,还有很多东西需要统一起来,比如代表的含义,形式大小等待细节。
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

统一的标准,从软件到硬件各方面都需要一支,这就形成了网络协议。

二.协议分层

【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

1.为什么协议要分层

1.本质是因为问题是层状的,所以协议定制出来肯定也是层状的。并且设置成层后,就可以降低耦合度,减少维护成本好维护。
2.因为协议分层后,我们可以认为是每层协议在和每层协议在直接通信,跟下层没有关系,下层出现问题,不会影响到上层。

【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

3.协议分层后,在逻辑上就可以看成各层之间在匹配通信

2.如何具体的分层

在网络中,协议具体被分成5层,但最重要的是网络层ip和传输层tcp,所以被称为TCP/IP五层模型。
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

这五层从下往上分别是,物理层,数据链路层,网络层,传输层,应用层。各自都有对应的协议。
每层具有不同的功能:
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

三.操作系统OS与网络协议栈的关系

1.物理层对应着系统中的硬件部分,比如网卡。
2.数据链路层对应着驱动程序,驱动软件。
3.而网络层和传输层是内嵌在内核里的,属于操作系统的部分。
4.应用层就相当于在操作系统之上的用户层,更准确的来说是用户层的各自软件应用。
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

操作系统和网络栈是一一对应起来的,网络通信的本质也就是在访问硬件网卡,而用户想要访问硬件,必须要经过操作系统,而操作系统又不相信用户,所以回给上层提供系统调用来访问内部。所以对应的网络通信,用户想要访问网卡,就必须调用系统调用,所以上层开发者为了更好的通信,所以会根据系统调用来开发一些协议来让我们使用。
5.操作系统虽然有多种,比如Linux和windows,但是网络栈却只有一种,所有的操作系统必须遵守,不然系统设备无法入网通信。
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

1.核心点:网络通信贯穿协议栈

所以网络通信的本质:就是贯穿协议栈的过程!这个过程先自顶向下,贯穿协议栈,然后通过网卡传输到另一台主机,再自底向上贯穿协议栈。
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

四.局域网中通信的基本原理

知识点1:在局域网(网络)当中,任意两台(直接相连的)主机是可以通信的,比如说手机可以投屏到电视上,但必须使用同一个网络才可以。
知识点2:在局域网(网络)当中通信协议有很多种,而以太网是属于局域网通信标准的其中一种

那么在局域网(就是在网络中)当中的两个主机是如何进行通信的呢?

两台主机在局域网中直接通信的过程,本质就是在不断的封装和解包的过程!
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

1.封装,解包分用

【问题1】什么叫封装呢?

网络通信时,需要贯穿协议栈,比如A主机要将消息通过网络发送给B主机,那么消息需要由A主机的网络协议栈由顶自下贯穿到B主机,再由底向上贯穿B主机的网络协议栈。
因为协议是附加字段,是一个结构体对象,所以每层协议都有对应的结构体对象。
消息就放在协议的后面,我们称这个部分为报文,而协议结构体部分称为报头。
每贯穿一层协议,报文都会多出一个协议报头,该协议报头就是该层协议的结构体对象。

1.报文是由报头和有效载荷构成,每一层协议栈都会往报文上添加新的报头,而报头后面的就变成新的有效载荷了。
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

贯穿协议栈,每层都需要添加报头,这个过程就是不断的封装报文。
【问题2】如何将数据发送给对端的呢?

网络协议栈的层状结构中,每一层都有协议,而通过协议就可以将数据发送给对端,比如数据链路层,通过以太网协议将数据发送给对端主机的数据链路层。
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

【问题3】什么叫解包?
由A主机发送给B主机,先自顶向下贯穿A主机网络协议栈,经过添加封装报头,最终到达数据链路层,数据和链路层通过协议,将报文发送给对端链路层。对端链路层再自底向上贯穿协议栈。
并且每层协议栈是可以区别哪些是报头哪里是报文的,然后对端主机的链路层就会将该报文的报头和有效载荷分离,将有效载荷交给上一层协议!
而由协议层分离报头和有效载荷的过程就是不断的在解包报文,会将属于该层的协议报头分离出去,再将剩下的有效载荷交给上一层(贯穿协议栈)
【问题4】什么叫分用?
对端主机的协议层接收到报文后,需要解析报文(分离报头和有效载荷)将有效载荷往上层协议发送,而它怎么知道发送上层的哪一个协议呢?每一层协议栈都会有许多协议存在,那么应该发送给上一层的哪一个协议呢?
所以几乎所有的协议,都要在报头中提供,将自己的有效载荷交付给上层哪一个协议的能力!这个能力就叫分用。

【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

【结论】:
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

数据包封装和分用
1.不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链
路层叫做帧(frame).
2.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装
(Encapsulation).
3.首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
4.数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 “上层协议
字段” 将数据交给对应的上层协议处理.

2.正确看待局域网

【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

局域网就一个网络,而网络就是一个文件,主机之间通信就是进程之间通信,进程之间通过网络进行通信,所以网络就是一个共享资源,并且要求是互斥访问该资源。

五.以太网下是如何通信的

我们知道报文在传递到链路层时,是根据以太网协议与对端链路层进行通信的。那么具体在以太网下是如何通信的呢?
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

【前提知识】 在局域网中,每台主机都会有一个唯一标识自己的标志–>Mac地址/ip地址,所以每台主机都是可以识别对方是谁的。【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

在局域网当中,发送一条消息,会被局域网内的所有主机接收到,也就是消息首先会贯穿协议栈,经历封装添加报头,到达数据链路层,最后在网卡硬件层面接收到。而对端网卡接收到数据是通过以太网接收到的。

以太网下数据是如何传输的呢?是如何通信的呢?

1.每台主机都有唯一的标识,所以A主机要发送消息给B主机,A主机是需要知道B主机的Mac地址的(消息贯穿A主机的协议栈到达数据链路层,在报头中是存储着B主机的Mac地址的)
2.首先在局域网当中所有的主机都会接收到报文(在逻辑上,每一层协议直接通信,也就是在链路层收到消息。A主机数据链路层通过以太网将报文发送给各主机的的数据链路层)。
3.而其他主机的数据链路层一旦接收到报文,就会进程报头分离解析,根据标识每台主机的ip地址发现不是发送给自己的,就会将报文直接丢弃。
4.如果发现是发送给自己的,就会将有效载荷发送给上一层协议。

【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

1.碰撞域

往局域网当中发送一条消息,该局域网下的所有主机都会收到,而多台主机同时往局域网中发送消息,那么这些消息就会发送碰撞,发生丢失,而发生碰撞的地方就称为碰撞域,所以以太网是基于碰撞域形成的。

所以以太网下通信是会存在数据碰撞问题的。
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

有问题就会有解决方法,如何解决该碰撞问题呢?
【碰撞机制】采用延迟发送
【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php
【网卡工作模式】正常模式与复杂模式
正常模式就是不是发送给自己的报文直接丢弃。
复杂模式就是不是发送给自己的报文不会直接丢弃。
【安全问题】

【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php

六.交换机

【Linux网络编程一】网络基础1(网络框架),Linux网络编程,网络,linux,php文章来源地址https://www.toymoban.com/news/detail-825282.html

到了这里,关于【Linux网络编程一】网络基础1(网络框架)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络编程】Linux网络编程基础与实战第三弹——网络名词术语

    数据包从源地址到目的地址所经过的路径,由一系列路由节点组成。 某个路由节点为数据包选择投递方向的选路过程。 路由器工作原理 路由器是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号的设备。

    2024年02月08日
    浏览(20)
  • C++Linux网络编程基础

    当动态库和静态库同时存在的时候,会优先使用动态库 。 静态库 1. 制作静态库 -c表示只编译,-o则是说明需要指定文件名 2. 使用静态库 3. 库文件的概念 程序在编译时,会将库文件的二进制代码链接到目标程序中,这种方式称为 静态编译 。 如果多个程序中用到了同一个静

    2024年01月20日
    浏览(20)
  • 【Linux】网络基础+UDP网络套接字编程

    只做自己喜欢做的事情,不被社会和时代裹挟着前进,是一件很奢侈的事。 1. 首先计算机是人类设计出来提高生产力的工具,而人类的文明绵延至今一定离不开人类之间互相的协作,既然人类需要协作以完成更为复杂的工作和难题,所以计算机作为人类的工具自然也一定需要

    2024年02月08日
    浏览(19)
  • C语言网络编程基础(linux)

    在linux操作系统下,有万物皆文件的概念,当一个进程想要打开/创建一个文件时,内核会给进程返回一个文件描述符,文件描述符是一个非负数,常用int类型表示,起到索引的作用,是为了高效管理进程打开/创建的文件的,指向的是被打开的文件。所有I/O的系统操作也都是通

    2024年02月07日
    浏览(15)
  • Linux高性能服务器编程 学习笔记 第五章 Linux网络编程基础API

    我们将从以下3方面讨论Linux网络API: 1.socket地址API。socket最开始的含义是一个IP地址和端口对(ip,port),它唯一表示了使用TCP通信的一端,本书称其为socket地址。 2.socket基础API。socket的主要API都定义在sys/socket.h头文件中,包括创建socket、命名socket、监听socket、接受连接、发

    2024年02月07日
    浏览(19)
  • 《3.linux应用编程和网络编程-第8部分-3.8.网络基础》 3.8.1.网络通信概述 3.8.3.网络通信基础知识2

        进程间通信: 管道 、 信号量、 共享内存, 技术多,操作麻烦     线程就是解决 进程间 通信 麻烦的事情,这是线程的 优势 3.8.1.网络通信概述 3.8.1.1、从进程间通信说起: 网络域套接字socket , 网络通信其实就是位于网络中不同主机上面                   的 

    2024年02月15日
    浏览(19)
  • 多人聊天室(带私聊功能)Linux网络编程基础

    在和同学一起努力下终于完成了期末作业哈哈哈哈 文章目录 目录 前言 一、需求分析 二、功能设计 1.服务器端: 2.客户端: 三、流程图: 编程流程图: 服务器流程图: 客户端流程图: 四、运行效果: 项目源码: 服务器源码 客户端源码: 总结: Linux网络编程是我们这学

    2024年02月09日
    浏览(19)
  • Linux C++ 网络编程基础(2) : TCP多线程一个server对应多个client

    作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/   tcp编程时, 一个server可以对应多个client, server端用多线程可以实现. linux下多线程可以使用POSIX的线程函数, 下面给出服务端和客户端的代码.   Linux POSIX线程库提供了一组函数来创建、管理和同步

    2024年02月13日
    浏览(17)
  • 【socket】从计算机网络基础到socket编程——Windows && Linux C语言 + Python实现(TCP+UDP)

    简单讲一下基础知识,便于后面代码的理解,建议大概浏览一下这一小节内容。这里讲的只是冰山一角,建议大家学习计算机网络相关知识,推荐几本书: 《计算机网络》(谢希仁) 《计算机网络 自顶向下方法》 《计算机网络技术》 《计算机网络基础及应用》 《Linux C从入

    2024年02月08日
    浏览(18)
  • Linux:概述 、安装 、文件与目录结构 、vim编辑器 、网络配置 、远程登录 、系统管理 、基础命令 、软件包管理 、克隆虚拟机 、shell编程

    2.1.1、Linux是什么? Linux是一个操作系统(OS) 所谓的操作系统就是直接用来操作计算机底层硬件的软件。 2.1.2、Linux的出现 官网: https://www.centos.org/ 进入官网进行下载 有很多的镜像,以阿里云的为例: 3.3.1、下载 官网: https://www.vmware.com/ 这是下载的企业版,30天试用期,可

    2024年02月05日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包