【我的Linux,我做主!】技术大牛告诉你Linux网络原理就该这么学!

Linux属于网络操作系统,所以网络功能是Linux的重要核心功能。我们知道网络模型包含总线型网络、星型网络、令牌环状网络等。数据在网络上传输是以电磁信号进行传输的,例如在总线型网络中,在同一时刻只能有一个信号在传输介质中传送,如果有多个主机同时发送信息,那么就会产生争用传输介质的情况,此时为了解决这个问题,我们就产生了MAC:Media Access Control的解决方案,即介质访问控制。我们给每一台接入网络中的设备一个唯一的识别码,从而可以使MAC这种算法产生的仲裁结果得以实行,每一台主机都会有一个MAC地址,而MAC地址使用的CSMA/CD技术完成网络线路仲裁,这个技术最早来源于以太网网络,传输信号通常会按照:载波侦听多路访问,冲突检测的方式进行数据的探测并传输(如下图)。此外例如环状网络是通过令牌环方式实现等等。

星型网络主要是通过一个HUB集线器将所有的主机进行连接,HUB集线器本身没有隔离信号等机制,只是简单的将主机连接在一起,所以数据在传输的过程中仍然会发生冲突。星型网络从整体上看仍然是属于总线型网络,当CSMA/CD的机制传输数据并且网络中的主机过多时,数据传输会有阻塞,冲突等,此时可以将一个整体的网络进行拆分,例如形成两个网段,中间使用网桥设备进行连接(如下图),在网桥中会有一个数据表记录哪一台主机在哪个端口的对应关系,因此当A主机发送的目的地在A主机端网络,那么信号就不会占用B端网络端口的信道,从而降低信号冲突概率。

一、交换机原理:
按照这个思路,当我们在网桥设备上划分多个网段,并且每个网段里只有一台主机时,此时冲突范围便限定在了主机和接入网桥设备的节点这根线路范围中(如下图),此时我们可以做到当A主机和B主机通信的时候,C主机仍然可以自由的和D主机进行通信,而不会因为CSMA/CD机制而导致通信信道冲突阻塞,而这个智能网桥设备就是我们熟知的“交换机”,因此交换机可以隔离冲突域。

二、路由器原理:
当两个交换网络相连的时候(如下图),例如主机A需要和M主机通信,当时1号网络中的A主机并不知道M主机具体的MAC地址等位置信息,如果只是简单的将1号网络和2号网络用通信线缆连接起来,那么广播信号便会充斥整个网络,如果网络中的主机量很大时,会形成广播风暴,从而影响整个网络的通信性能,此时我们需要使用一个特殊的设备将1号网络和2号网络连接起来,使得中间设备在接受广播信号时不予理会直接丢弃,但是又能够完成不同网段中的主机通信的需求。MAC地址是计算机通信地址,传输数据必须使用MAC地址,但是MAC地址只能标识不同的主机,不能划分不同的网络,所以属于平面地址,在次基础上我们引入了逻辑地址(IP地址)的概念,可以对不同的网络进行划分。例如A主机的逻辑地址是1.1,它声明自己需要传输数据的目的地是2.1,此时中间设备发现是不同的网络之间的通信,路由器上的网关是交换机网络通信的关卡它们也有自己的MAC地址辅助通信,1号网络的广播通过中间设备后只在2号网络的广播中继续发送,最后主机M将自己的逻辑地址和MAC地址返回给发送方,从而完成通信。中间的特殊设备就是大家所熟知的“路由器”,因此路由器可以隔离广播域。

三、OSI七层协议:
OSI七层协议的由来:由于网络连接过程相当复杂,包括硬件数据封装与应用程序的相互链接等,如果想要写一个网络链接的全部功能都集中在一起的程序,那么任何一个环节出错,整个程序都要改写,非常麻烦,因此我们将整个网络连接过程分成多个层次来处理,且每层数据传递是顺序传递的,这就是OSI七层协议。七层协议具有以下特点:
每个层次都有特定的独立的功能
每个层次的代码可以独立编写
层与层次之间的功能互不干扰
每一层次只认识对方同一层的数据

物理层:由于网络传输介质传输的是比特位(01),因此物理层必须定义所使用的传输设备的电压和信号等,同时还必须了解数据帧转换成比特流的编码方式,最后链接实际传输介质并发送/接收比特信号。
数据链路层:硬件部分,主要处理MAC数据帧,传递给物理层转换成比特流;软件部分主要处理来自上层的数据表转换成MAC的格式。相关协议:PPP
网络层:定义IP地址,定义计算机之间的链接建立,终止维护等,数据包的传输路径等。相关协议:IP、ICMP、ARP、RARP
传输层:定义发送端与接收端的链接技术(TCP,UDP)同时包括该技术的数据包格式,数据包的发送,流程的控制等,以确保各个资料数据可以正确无误的到达目的端。相关协议:TCP、UDP
会话层:确定网络服务建立链接的确认。
表示层:定义网络服务(或程序)之间的数据格式的转换,使数据格式标准化,也包括数据的加密解密也是在这层上处理。
应用层:将数据发送给应用程序,并最终展示给用户。相关协议:HTTP、FTP、SMTP等。
虽然OSI七层协议的架构非常严谨,但是由于太过严谨导致程序编写相当不容易,因此产生了TCP/IP协议。(如下图)

四、TCP/IP的网路层相关数据包与数据
(1)IP数据包的封装:
了解IP数据包的封装,才能知道IP到底如何产生的,IP数据包可达到65535bytes

相关名词解释如下:
IP version:IP版本号,包括IPV4或者IPV6
Header Length:首部的长度
Type of Service:服务类型
Total Length:整个报文的长度
Identifiction:标记符
Fragment Offset:片偏移
DF:没有更多的片
MF:更多的片
Time-To-Live:生存时间
Protocol:协议,常见的是TCP和UDP协议
Header Checksum:首部校验和
Source IP Address:源IP
Destination IP Address:目的IP
Options:可选项
Data:数据
(2)面向连接的可靠TCP协议:
TCP(Transmission Control Protocol)意即传输控制协议,不同于UDP(User Datagram Protocol)用户数据报协议。TCP属于可靠的传输控制协议,在网络IP层之上是TCP传输层,在传输层数据被打包成TCP数据包。

相关名词解释如下:
Source Port Number:源端口号
Destination Port Number:目的端口号
Sequence Number:序列号
Acknowledgement Number:确认号
Header Length:首部长度
Reserved:保留位
URG:紧急位
ACK:确认位
PSH:推送位
RST:重置位
SYN:同步位
FIN:结束位
Window Size:窗口大小
TCP Checksum:TCP的校验和
Urgent Pointer:紧急指针
Options:可选段
Data:数据
(3)IP地址的种类划分:
在IPV4中有两种IP类别
Public IP:公共IP,经由InterNIC统一规划IP,只有这种IP才可链接到Internet。
Private IP:私有IP或保留IP,不能直接连上Internet的IP,主要用于局域网络内的主机链接规划。
Public IP公共IP如下:(注:128+64+32+16+8+4+2+1)
A类:255.0.0.0~8-子网掩码
0-000 0001 ~ 0-111 1111【1~127】
127个A类地址,127用于回环,总共有2^7-1个网络地址
容纳多少个主机:2^24-2
主机位全0:网络地址
主机位全1:广播地址
B类:255.255.0.0~16-子网掩码
10-00 0000 ~ 10-11 1111【128~191】
64个B类地址,总共有2^14个网络地址(因为第一个8位中有剩余的6位网络地址,第二个8位中全部都是网络地址)
容纳多少个主机:2^16-2
C类:255.255.255.0~24-子网掩码
110-0 0000 ~ 110-1 1111【192-223】
32个C类地址,总共有2^21个网络地址
容纳多少个主机:2^8-2
D类
1110-0000 ~ 1110-1111【224-239】
E类
【240-255】
Private IP私有地址如下:
私有地址可以在以太网中使用,但不会在公共互联网中使用
A类:10.0.0.0/8 ~ 10.255.255.255/8
B类:172.16.0.0/16 ~ 172.31.0.0/16
C类:192.168.0.0/24 ~ 192.168.255.0/24
(4)划分子网:
一个大网络分成若干个子网,则网络ID向主机ID借位实现。例如要划分201.1.2.0/24网络为2个子网,一个子网需要容纳4台主机,另一个子网需要容纳6台主机。则可以从第四个主机位8位中划分出2位出来作为网络位使用。可以得到如下的四种组合:
00(全0的情况不考虑)
01-00 0001 ~ 01-11 1110【65~126】201.1.2.64网路地址,201.1.2.127广播地址
10-00 0001 ~ 10-11 1110【129-190】201.1.2.128网络地址,201.1.2.191广播地址
11(全1的情况不考虑)
(5)TCP的三次握手及四次挥手详解:

三次握手:
第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口。
第二次握手:服务器发回确认包ACK应答,即SYN标志位和ACK标志位均为1。
第三次握手:客户端再次发送确认包ACK,SYN标志位为0,ACK标志位为1。
四次挥手:
第一次挥手:客户端发送一个FIN,用来关闭客户端到服务器的数据传送,客户端进入FIN_WAIT_1状态。
第二次挥手:服务器收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务器进入CLOSE_WAIT状态。
第三次挥手:服务器发送一个FIN,用来关闭Server到Client的数据传送,服务器进入LAST_ACK状态。
第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务器确认序号为收到序号+1,服务器进入CLOSE状态,完成四次挥手。
五、Linux网络配置示例:
早期红帽5系统上通过/etc/modprobe.conf的配置文件中使用“alias”别名来设置设备名,目前红帽6系统中是在/etc/udev/rules.d目录下设置设备名。
#ifconfig -a eth1
解释:显示所有接口的配置信息。
#ifconfig eth1 192.168.10.123/24
解释:配置的地址立即生效,但重启网络服务或主机都失效。
网络服务:
RHEL5:/etc/init.d/network {start|stop|restart|status}
RHEL6:/etc/init.d/NetworkManager {start|stop|restart|status}


iproute2:比较强大的网络管理软件包

原文地址:http://blog.51cto.com/13613726/2092197

时间: 2024-11-01 20:19:17

【我的Linux,我做主!】技术大牛告诉你Linux网络原理就该这么学!的相关文章

技术大牛告诉你,如何系统有效的学习软件开发?

有些人一出生就是为电脑技术而活的,充满着浓厚的兴趣.特别对编程开发对电脑技术有自己的一些向往. 而往往有时总是依靠搜索引擎进行学习,东看一点西看一点,没有系统的学习完一整套思想逻辑. 自己也可能有所成就,但是每当进行进修的时候就会发现,自己的不足,学习其他的东西很费劲.那我们究竟应该如何系统有效的学习一门编程语言呢? 我也不是什么大神,至今学习C#语言三年,期间也学习java android python等其他语言.算是对学习一门编程语言有自己的一些小见解.希望能帮助正在准备学习一门新语言的你.

架构师是大忽悠吗?阿里技术大牛告诉你真相!

来源:阿里云 作者:林昊(花名毕玄),阿里巴巴技术保障部研究员,曾任淘宝网平台架构部架构师.个人的研究方向主要为Java模块化.动态化系统的构建,以及高性能大型分布式Java系统构建,主导阿里数据中心异地多活项目建设. 架构师,这个title就和总监之类的title一样,已经彻底被用烂了.但在一个软件产品的生命周期中,架构师是实实在在的一个极度重要的角色.架构师非常重要的职责是编写整个系统中核心部分的代码.这个部分并不一定是技术挑战最高的,但对整个系统的质量甚至成败起到非常关键的控制作用.架构师

嵌入式Linux的调试技术

嵌入式Linux的调试技术对于复杂的Linux驱动以及HAL等程序库,需要使用各种方法对其进行调试.例如,设置断点.逐步跟踪代码.输出调试信息等. Printk函数的用法与printf函数类似,只不过printk函数运行在内核空间,printf函数运行在用户空间.也就是说,像Linux驱动这样的Linux内核程序只能使用printk函数输出调试信息.Printk函数在printk.c文件中实现. 虽然使用printk函数可以很方便的将消息写入日志文件或控制台.但大量使用printk函数频繁操作日

Android深度探索(卷1)HAL与驱动开发 心得体会 第十章 嵌入式Linux的调用技术

Android深度探索(卷1)HAL与驱动开发 心得体会 第十章  嵌入式Linux的调用技术 对于复杂的Linux驱动以及HAL等程序库,需要使用各种方法对其进行调试.例如,设置断点,逐步跟踪代码.输出调试信息等.虽然嵌入式Linux在调试方面并没有Visual Studio.Delphi.Eclipse这些可视化工具方便,但是学习一些这方面的技术无疑更有助于开发强大而稳定的Linux内核模块. 对于嵌入式Linux内核模块,可执行程序.代码库的调试可能更要复杂些.因为在大多数时候需要至少两台

[转]20位活跃在Github上的国内技术大牛

FROM : http://blog.csdn.net/yaoxtao/article/details/38518933 20位活跃在Github上的国内技术大牛 本文列举了20位在Github上非常活跃的国内大牛,看看其中是不是很多熟悉的面孔? 1. lifesinger(玉伯) Github主页:        https://github.com/lifesinger 微博:@        玉伯也叫射雕 玉伯(王保平),淘宝前端类库 KISSY.前端模块化开发框架SeaJS.前端基础类库

技术大牛面试 http://www.itmian4.com/forum.php?mod=viewthread&tid=3824

不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic...在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技术屌丝的同学们,是否真的与国内IT巨头遥不可及呢? 当你打开这个帖子的时候,我已经默认你是此文的目标读者,也就是想进入国内一流互联网企业的非牛人应届生. 你不需要拿NOI的奖,无需是开源社区名人,也用不着发过牛逼的SCI论文.(没错,笔者就是这样的技术屌丝) 请记住,校园招聘,应聘的绝大部分人都只是

技术大牛带您品味舌尖上SDK

在集成第三方SDK的开发路上,您是否遇到过种种疑惑呢? 百度.谷歌.QQ群--,各种求教方式,想必您都用过吧? 俗话说"授人以鱼不如授人以渔",科大讯飞正在做着"授人以渔"的事情,针对Android.Java.Windows/Linux SDK技术大牛们都已相继分享,那么高大上的iOS SDK何时分享呢? 不仅您捉急,讯飞的小伙伴们更捉急,"台上一分钟台下十年功",讯飞的小伙伴们经过精心准备,即将重磅推出iOS SDK的分享,拭目以待不如现场参与

第十章 嵌入式Linux的调试技术

本章的主要内容是嵌入式Linux的调试技术.对于复杂的Linux驱动及HAL等程序库,需要使用各种方法对其进行调试. 一.打印内核调试信息:printk 该函数的用法与printf函数类似,只不过printk函数运行在内核空间,printf函数运行在用户空间.像Linux驱动这样的Linux内核程序只能使用printk函数输出调试信息.Printk函数在printk.c文件中实现,该文件的路径:/root/kernel/linux_kernel_2.6.36/kernel/printk.c. 二

最牛技术 1秒启动Linux的窍门

1秒启动Linux可以实现吗?我们知道Linux系统开机并不算快,最少也需要11秒,但是,现在有一个技巧,可以1秒打开linux系统,到底是什么技术这么牛?请看下文详细介绍 尽可能快的启动系统,对于自动化设备是非常重要的.系统能够在用户无法感知的时间内启动,也就意味着在不需要工作时,可以完全切断电源,而不是挂起进入休眠状态.本文基于Atmel AT91系列片上系统和NAND闪存,经过一系列的优化,将Linux系统启动时间,从最初的11秒,降低到最终的656毫秒. 背景知识 系统从上电到完全启动,