目录
1. 分层模型
2. 物理层
3. 链路层
4. 网络层
5. 传输层
6. 应用层


1. 分层模型


越接近下面的层,越靠近硬件,越上面的层,越接近用户。

网络的每一层都定义了许多协议,有个协议的总称,叫做“tcp/ip协议”,不仅仅包括TCP和IP协议,还包括了其他协议。

2. 物理层

物理层是将电脑连接起来的物理手段,作用就是负责传送0/1的电信号。

3. 链接层

因为0/1信号是没有意义的,必须规定他的解读方式。链接层负责规定了0和1电信号的分组方式。

早期的时候,每家公司都有自己的电信号分组方式。逐渐地,一种叫做“以太网”(Ethernet)的协议,占据了主导地位。

以太网协议:以太网规定,一组电信号构成一个数据包,叫做“帧”(Frame)。每一帧分成两个部分:标头(Head)和数据(Data)。

  • 标头:包含数据包的一些说明项,如发送者,接受者,数据类型等。
  • 数据:数据包的具体内容。

在这里,发送者和接受者是怎么标识的呢,是使用MAC地址来标识的,而MAC地址实际上就是网卡上的地址,这个地址是全球唯一的。

标头的两个MAC地址占了12字节,类型占了2个字节,FCS(帧校验序列)占了4个字节,所以标头固定占18字节,而数据为46-1500字节。

因此,如果两个网卡要进行通信,那么发送方必须知道接收方的MAC地址,那么怎么才能知道另一个网卡的MAC地址呢?答案是APR协议,APR是网络层协议,这里先不介绍,我们聊一下有了MAC地址如何把数据包准确送到接收方。

这里采用的是广播的方式,A向子网络发送一个数据包,子网络中的每台计算机都会受到这个包,计算机对比这个帧中的目标MAC地址是否一致,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。

4. 网络层

我们知道一个网卡知道另一个网卡的地址就可以进行通信,而且发送方是采用广播的方式,因为不可能广播到所有计算机,所以网络层定义了子网络,发送方只能发送到子网络中。

IP协议:网络层采用IP协议来定义网络地址。

互联网上的每一台计算机,都会分配到一个 IP 地址。这个地址分成两个部分,前一部分代表网络,后一部分代表主机。

单单从 IP 地址,我们无法判断网络部分。以 172.16.254.1 为例,它的网络部分,到底是前 24 位,还是前 16 位,甚至前 28 位,从 IP 地址上是看不出来的,要用到子网掩码。

所谓“子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于 IP 地址,也是一个 32 位二进制数字,它的网络部分全部为1,主机部分全部为0,并且1和0分别连续。

比如,IP 地址 172.16.254.1,如果已知网络部分是前 24 位,主机部分是后 8 位,那么子网络掩码就是 11111111.11111111.11111111.00000000,写成十进制就是 255.255.255.0。

因此我们需要重新封装一下帧,这里我们只需要把IP数据包直接放到以太网数据包的数据部分,再把IP和一些校验信息放到以太网数据包的标头部分就可以了。

ARP协议:之前留了一个悬念,ARP协议就是发送方找到接收方的mac地址的,它是怎么做到的呢?

首先每台机器维持一个ARP高速缓存表,用来记录IP和MAC地址的映射。

  • 如果目的IP和自己在同一个网段:

    • 当IP层的ARP高速缓存表中存在目的IP对应的MAC地址时,则调用网络接口send函数(参数为IP Packet和目的MAC))将数据提交给网络接口,网络接口完成Ethernet Header + IP + CRC的封装,并发送出去;

      • 当IP层的ARP高速缓存表中不存在目的IP对应的MAC地址时,发送ARP广播请求目的IP的MAC,收到ARP应答答之后,将应答中的IP地址,对应的MAC对缓存在本地ARP高速缓存表中,然后调用网络接口send函数(参数为IP Packet和目的MAC))将数据提交给网络接口,网络接口完成Ethernet Header + IP + CRC的封装,并发送出去;。
  • 如果目的IP地址和自己不在同一个网段,就需要将包发送给默认网关,这需要知道默认网关的MAC地址:

    • 当IP层的ARP高速缓存表中存在默认网关对应的MAC地址时,则调用网络接口send函数(参数为IP Packet和默认网关的MAC)将数据提交给网络接口,网络接口完成Ethernet Header + IP + CRC
        

      • 当IP层的ARP高速缓存表中不存在默认网关对应的MAC地址时,发送ARP广播请求默认网关的MAC,收到ARP应答之后,将应答之中的<默认网关地址,对应的MAC>对缓存在本地ARP高速缓存表中,调用网络接口send函数(参数为IP Packet和默认网关的MAC)将数据提交给网络接口,网络接口完成Ethernet Header + IP + CRC的封装,并发送出去。

5.传输层

为什么要有传输层这个东西呢?原因是数据包如果发送到了你的电脑,你怎么知道是网页的内容还是qq音乐的内容?因此,我们需要一个参数,用来标识这个数据包属于哪一个进程,这个参数就是端口。

端口是0-65535之间的一个整数,16个bit,其中0-1023被系统占用,所以可以把传输层理解成端口到端口的连接。

其中UDP协议和TCP协议都是传输层协议,其实就是在ip数据包中加入端口信息,UDP协议实现起来比较简单,因为IP协议本来就是不可靠交付,一旦一个数据包发出,无法知道对方是否收到。

而TCP可以理解成有确认机制的UDP协议,每发出一个数据包都要求得到确认。如果有一个数据包遗失,但是收不到确认,就需要重传了。

6.应用层

应用层的作用,就是规定应用程序的数据格式。

TCP 协议可以为各种各样的程序传递数据,比如 Email、WWW、FTP 等等。那么,必须有不同协议规定电子邮件、网页、FTP 数据的格式,这些应用程序协议就构成了“应用层”。

Linux网络编程 之 网络协议概述(一)相关推荐

  1. linux应用编程和网络编程

    注:本文是对朱老师linux应用编程和网络编程课程的备忘引导性笔记,主要是为了能够在学完后快速回忆起相关内容.本文主要记录了一些关键易忘性知识点并包含少量理解性内容,遵循尽量精简的原则,以尽量少的篇幅 ...

  2. iOS网络编程开发—HTTP协议

    iOS网络编程开发-HTTP协议 说明:apache tomcat服务器必须占用8080端口 一.URL 1.基本介绍 URL的全称是Uniform Resource Locator(统一资源定位符) ...

  3. WinSock API网络编程——TCP/IP协议详解

     WinSock API网络编程--TCP/IP协议(http://www.impcas.ac.cn/usr/lujun/browse.asp?id=winsock_tcp)            ...

  4. day30,网络编程和各种协议

    网络编程    1.网络通讯协议 理论知识点 学习网络编程的目的? 什么是互联网 网: 由多个节点相互连接组成 渔网 蜘蛛网 计算互联网: 由多台计算机通过某种介质相互连接而组成 互联网之所以存在就是 ...

  5. (47)LINUX应用编程和网络编程之二Linux文件属性

    Linux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些目录应该是标准的.各个Linux发行版本会存在一些小小的差异,但总体来说,还是大体差 ...

  6. 网络编程:网络协议简介

    这是张富涛的第10篇原创 网络编程:网络协议简介 网络协议在网络编程中是一个比较神秘的概念,今天就由我们揭开它神秘的面纱吧. 1. 什么是网络协议? 网络协议是指对于网络中传输的数据格式的规定.在计算 ...

  7. 网络编程——基于TCP协议的通讯录【课程设计】

    网络编程--基于TCP协议的通讯录[课程设计] 本文目录 网络编程--基于TCP协议的通讯录[课程设计] 一.设计题目和要求 设计目标: 课程设计系统组成及模块功能: 二.设计内容 服务端 客户端 S ...

  8. 网络编程及三大协议(TCP + UDP + Http)

    网络编程及三大协议(TCP + UDP + Http) 一.网络编程 1.计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络 ...

  9. 网络编程--TCP/IP协议

    参考:https://lijie.blog.csdn.net/article/details/105297532 https://blog.csdn.net/qq_20785973/article/d ...

  10. 迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等

    文章目录 网络编程概述 网络通信要素 要素一IP和端口号 要素二网络协议 TCP网络编程 UDP网络编程 URL网络编程 Java网络编程基础 网络编程概述 Java是Internet上的语言,它从语 ...

最新文章

  1. 卷积神经网络(CNN)张量(图像)的尺寸和参数计算(深度学习)
  2. 剑指offer:面试题14- I. 剪绳子
  3. 简书python自动化运维_简明Python开发教程(4):网络自动化运维的曙光
  4. PL/SQL异常处理(原创)
  5. Elasticsearch Mapping 详解
  6. intellij idea 高级用法之:集成JIRA、UML类图插件、集成SSH、集成FTP、Database管理
  7. 线程高级篇-Lock锁和Condition条件
  8. 不要再用main方法测试代码性能了,用这款JDK自带工具
  9. Rabbitmq专题:springboot如何整合Rabbitmq?Rabbitmq有哪些工作模式?
  10. 【BZOJ3609】人人尽说江南好,博弈
  11. 云课堂让职业院校软件开发教学更简单
  12. java itext read a pdf file_java - 使用iText7读取PDF时遇到的问题(使用iText5) - 堆栈内存溢出...
  13. python 模拟鼠标键盘_如何用 python 模拟鼠标和键盘的操作
  14. 松翰单片机--SN8F5702学习笔记(三)Overview
  15. java伪随机数概率_抽奖伪随机数生成器(Java)
  16. 妈妈再也不用担心我的博客访问量了(一个可以刷博客访问量的小程序java)
  17. ReactNative Animated动画详解
  18. 席慕容的诗歌——《我愿为莲》
  19. 数据库DDL、DML分别是什么
  20. 【CS231n 课程笔记】第八讲-----常见的深度学习框架,以及GPU和CPU介绍。

热门文章

  1. 【网络编程】之十一、重叠IO Overlapped IO 完成例程
  2. C与C++在形参的一点小区别
  3. RTC 技术知识体系
  4. Python的re.match()和re.search()的使用和区别
  5. 用Python实现优先级队列
  6. nginx如何开启debug日志及相关配置
  7. 假笨说-谨防JDK8重复类定义造成的内存泄漏
  8. 成为技术大牛,只能靠天赋吗?
  9. 绝不重新定义继承而来的缺省值参数
  10. 云原生视频时代已开启,华为云准备好了