第五十二讲——程序的组成 从这一讲开始变得开始比较有意思了,先来讲一讲程序的组成。 软件包其实就是应用程序,程序:architecture 例如:c语言:源代码-->编译成为二进制格式 脚本类语言(需要解释器):源代码-->编译-->连接—>运行,解释器本身是二进制程序。 程序运行时还会依赖库文件,库文件又分为动态库,静态库。 静态库是封装到程序中的,动态库为共享库,存在于运行环境的特定目录中。 程序运行时在内存中大体分为以下几个部分:程序的组成:指令+数据。 text代码段,所有的指令在这里存放 date+bss数据是紧跟着代码存放的,这些数据是初始化为零的变量,大多都是全局的。 heap堆—heap堆,不停地动态分配内存的空间 stak栈—stak栈处于最底端,是往上变化的,是本地变量和其他数据的存在,。 heap和stak合起来称为堆栈,他们的作用域不同,访问指令也不同,生命周期也不同,所以分别存放。 动态库可事先已经在内存当中了,当一个程序需要调用动态库时,只需要指向这么一个内存空间,如果这个共享库没有在内存中,那么操作系统就会帮忙将动态库载入内存,并分配给进程调用。 通常来说,指令和库是只读的,其他的数据是可变的,在编程中,我们需要指定的库称为共享库。 在linux操作系统中,共享库文件以.so结尾,share object 共享对象。 我们此前讲过,一个程序想要运行,为了定义这个程序运行的特征,程序还可以通过外部文件加载一些指令,属性信息,这些外部文件称为配置文件。 配置文件中定义的属性或变量会被程序在启动时加载,其实这些配置文件中定义的为变量,程序加载的是文件定义的变量。 程序的组成部分: 1. 二进制程序 2. 库文件(自身提供的库,共享库),自身提供的库就是讲程序自身的功能以接口的形式提供给其他程序。 glibc 通用的c语言库 kernel 内核,系统调用 glibc是几乎所有程序都要用到的最底层的核心库,可能这些库的功能不够完善。一些程序安装好之后,它可能会依赖glibc提供的库,但是也有可能有其他程序调用这个程序的功能,所以这个程序将自身的某些功能当做库来实现,所以这个程序既会生成二进制程序文件,也会生成库,生成的库放到/lib,/usr/lib,自身能够调用,其他的软件也能够调用,所以共享库是由各个软件的库和glibc共同组成的。 3. 配置文件 4. 帮助文件 给自己讲linux 2017-01-21 评论 1418 次浏览
第五十一讲——linux网络相关 linux最主要的功能就是网络,对于一个主机来讲,IP和子网掩码是最根本的,只要有IP就得有子网掩码,然后就是网关,没有网关就只能建立本地主机通信,无法与远程主机通信。 我们有时候需要通过主机名进行通信,这叫DNS,我们需要指定一个DNS服务器,帮助我们把一个名称转换成IP,或者将IP转换成名称,所以我们要配置很多的属性。 对于linux来讲,网络功能是内核的组成部分,所以在内核空间中会有一个TCP/IP的模块,因此我们在配置一个地址的时候是在内核上生效的,只不过我们是在用户空间中使用命令去配置而已,但是我们要知道,在linux中通过命令配置的各类参数关机之重启后就会失效,使用命令修改是修改内核中的数据,保存在内核所在的内存当中,关机重启后依旧是从硬盘读取,所以需要写入配置文件。 1. 使用命令设置,会立即生效,但是不能永久有效。 2. 写入配置文件,不会立即生效,但是在下一次开机后会永久生效。或者手动重读配置文件。 网络配置不仅仅是配置IP地址,子网掩码,网关,有时候我们还需要手动指定路由,其实linux就是一个路由,我们完全可以多装几块网卡并指定路由条目,包括主机路由,网络路由。 服务器要求时时在线,因此在很多的服务器上可以将两块网卡当做一块网卡来使用,在系统内部将他们绑定起来建立起一个逻辑网卡,而后我们发送报文时通过逻辑网卡向外发送数据,可以并行使用,提高传输效率。也可以将其中的一块网卡作为冗余,至工作一块,当工作的网卡出现故障的时候,另一块网卡会顶替工作,这种方式我们称为网卡的绑定。bonding,可以绑定多块网卡,以负载均衡的方式提高传输效率。 一台linux主机接入网络需要的信息如下: IP:逻辑地址 NETMASK:子网掩码 GATEWAY:网关 HOSTNAME:主机名 DNS:服务器地址,用于解析其他主机的主机名,linux上的DNS可以有3个,DNS1,DNS2,DNS3,至少两个。 路由信息: DHCP:自动获取(动态获取)主机配置协议,DynamicHost Configuration Protocol,这是一种让DHCP服务器为其主机提供地址或者其他网络配置信息的一种服务。 当设置DHCP服务时,如果当前网络上没有DHCP服务器,则将IP设为网段中的一个地址,这个网段内的地址只能用于本地通信,没有网关,是随机配置的。 再次强调一下,网络是属于linux内核的功能。所以我们给linux主机上的网卡配置地址的话,这个地址属于内核,并不属于网卡。当一台主机上安装了多个网卡时,当通过网卡A去ping网卡B的时,主机会响应,因为地址是属于内核的,不属于网卡,只要内核发现本机有这样的地址,无论是通过哪一块网卡都会响应。 对linux而言,每一个网络接口都有一个名称。 lo:本地回环网卡,本机既作为服务器,也作为客户端,自己跟自己联系的时候用到,这个时候数据报文不发向网络,就在内存内部完成客户端到服务端。 eth:以太网网卡通常使用eth##开头,后跟数字。 ppp:点对点通信ppp##。 对于系统来讲,它所识别的每一个硬件是靠硬件设备的驱动程序,也就是是主设备号、次设备号所关联的驱动程序来识别。所以我们任何时候访问一个设备的时候都是通过设备文件来访问的,但是这样引用一个网卡的话会有诸多不便,因此,这些设备有了名称的机制。即我们在引用网卡的时候直接使用名称来引用,不用再专门制定内核驱动或者设备文件。 ifconfig:linux上非常古老的用于实现网络配置的命令,可以直接显示当前主机上处于活动状态网卡的信息,其中: scope:IP地址的作用范围, globe:全局的,对其他主机能够找到(可见) link:地址仅对当前网卡有效。 RX Packets:接收到的报文个数 dropped:丢弃的个数 overruns:溢出的个数 frame:帧数 TX Packets:传出数据包的个数 collision:有多少次发生冲突 txqueuelen:传输队列的长度 RX bytes:收到的字节数 TX bytes:传出去的字节数 Interrupt:中断号 ifconfig –a 显示所有接口的配置信息,我们也可以只显示其中一块网卡的信息,ifconfig eth0(网卡名称) 我们爱可以使用ifconfig命令给指定网卡配置IP赫尔掩码,格式为ifconfig eth# IP/MASK,其中MASK支持两种格式,255.255.255.0,24,子网掩码是必须要写的。 ifconfig eth# up 启用网卡 ifconfig eth# down 禁用网卡 如果别人ping不通,可能是防火墙之类的原因,自己ping自己可以判定内核中的TCP/IP协议栈是否正常工作,我们要确保本地通信无误。 在RHEL系列linux上,对于网络地址的管理可以通过一个内置的服务脚本来实现,在/etc/init.d/目录下的network指定该目录下的文件并键入start|restart|stop|status,可以对指定的服务开启、重启、关闭以及状态的查询。 网关:route命令(路由),route有许多的子命令。 route不带任何参数的时候是查看本地路由表。 路由表中的信息表示: flags:U表示启用状态(处于启用状态) G表示是一个网关路由,即有下一路的路由条目。 default:默认路由。 add 添加一条路由,当我们add添加一条路由时,有两种 主机路由:-host 添加一条主机路由 网络路由:-net 添加一条网络路由,当-net指向0.0.0.0时,为添加默认路由 route add –net 10.0.0.0/8 gw 192.168.10.1 gw(网关),即通过192.168.10.1能够到达10.0.0.0/8网络 没有带网关的说明为本地网络,不需要通过任何网关就能够到达的,使用格式为: route add -net|-host DEST(目标) gw NEXTHOP(下一跳) 我们也可以指定默认路由 route add default gw NEXTHOP明确说明填的是默认路由 del 删除一条路由 route del -net|-host DEST 一般来说不用指定删除条目的gw route –n以数字的方式显示(将default等转换为数字的形式)。 使用route命令做出的修改在重启服务或者主机后失效,我们之前讲过的通过命令配置的都是临时生效。我们要向永久生效,需要将配置写入相应的配置文件当中。 网络配置文件:/etc/sysconfig/network 网络接口配置文件:/etc/sysconfig/network-scripts/ifcfg-interface-name(对应网卡的名称)。 网卡的配置信息: DEVICE=关联的设备,需要与文件名的后缀同名。 BOOTPROTO=引导协议,一般来说只有四个取值(static、none、dhcp、bootp[较为古老的协议,dhcp的前身])。 static:使用静态地址,即自己配置地址 none:使用静态地址。 dhcp:使用dhcp服务自动从dhcp服务器上获取地址。 IPADDR=IP地址 NETMASK=子网掩码 GATEWAY=网关(设定网关,即默认路由) ONBOOT=是否开机时自动启动此设备 HWADDR=硬件地址,要与硬件中的地址保持一致(可以省略) USERCTL=[yes|no]是否允许普通用户控制此接口 PEERDNS=[yes|no]是否在BOOTPROTO为dhcp时接收由dhcp服务器指定的DNS地址。 当我们的BOOTPROTO=dhcp时,dhcp服务会对/etc/resolv.conf文件进行修改,如果不想由dhcp服务器上获取DNS则在网卡配置中声明PEERDNS=no即可。 修改/etc/sysconfig/network-scripts/ifcfg-interface_name文件后,不会立即生效,重启网络或者主机生效。 路由信息的添加,与route命令的添加不太相同,我们需要编辑/etc/sysconfig/network-scripts/route-eth##文件,其添加格式有两种,且两种不能够混合使用: 第一种:DEST(可以为host主机,net网络) via NEXTHOP(下一跳,网关),即从下一跳到达目标(DEST) 第二种,三个一组: ADDRESS#= NETMASK#= GATEWAY#= DNS服务器的指定,只能编辑配置文件,在interface配置文件中也可以进行修改,修改DNS的配置文件为/etc/resolv.conf 指定本地解析,即我们没有DNS,但是我们又想使用主机名去访问一个主机,我们可以编辑/etc/host文件指定本地解析,其格式为: IP地址 主机地址 别名 主机IP 主机名称 主机别名(可以省略) 当我们本地解析的时候,会先去/etc/host文件中寻找,没有时采取DNS(简单的讲就是找DNS缓存),当DNS缓存中没有的时候再去DNS服务器上寻找。 配置主机名: 命令:hostname 主机名 ——立即生效 编辑/etc/sysconfg/network HOSTNAME=主机名 重启网络服务不会影响主机名,一般重启主机才会生效。 策略路由:一个路由中有多张路由表,例如我们希望电信的用户走电信,联通的用户走联通,那么就需要使用策略路由,这样一来就会有多个默认路由,且位于不同的路由表中。 有一个软件包叫iproute2,iproute2是一个很强大的软件包,它提供了一个ip命令,ip命令下有很多的子命令。能够实现IP地址的配置,还能够实现路由的配置,以及实现路由表的管理等等强大功能,重要的是,要使用策略路由也是使用它完成的。 ip link:网络接口属性(配置) addr:协议地址 route:路由 ip –s显示额外的统计信息。 link show 查看网络接口 ip –s link show 设定网卡的功能: ip link set DEVICE{up|down|arp{on|off}} set下的子命令: promisc{on|off}混杂模式,抓包时使用 multicast{on|off}启用,关闭多播功能。 name 改名,只是当前生效 mtu 改变mtu的大小(MTU指某一通信协议的某一层面上上能通过的最大数据包大小,以字节为单位) txqueuelen PACKETS 指定传输队列的长度。 一块网卡可以使用多个地址,即网络设别可以别名。 eth0 eth0:0,eth0:1,eth0:2使用ifconfig命令也可以实现 ifconfig eth#:# IP/NETMASK ifconfig配置后只是临时生效,永久有效需要写入配置文件/etc/sysconfig/network-scripts/ifconfig-eth#:#,即新建一个文件,并且配置文件中DEVICE与文件后缀要一致。 我们需要注意的是,别名(非主要地址)不能使用dhcp动态获取地址 ip支持策略路由,而且还提供了一个tc的工具,tc可以实现流量的控制。 说一说ip相关的一些命令: ip addr add 添加,我们在使用ip命令添加地址的时候也可以指定别名 ipaddr add IPADRESS dev [DEVICE]指定设备 lableeth#:#(别名) 别名可以使用ifconfig可以进行查看,其标识为secondary(辅助地址,不是第二个) del 删除,删除的格式如下 ip addr del IPADDRESS dev DEVICE show 显示,显示时我们还可以为show指定各种显示的参数 dev NAME指定网卡的名称 to PREFIX(以网络加掩码的形式显示) to 10/8 显示10网段的IP to 192.168.3/24 显示192.168.3网络的IP label 显示某个label的地址。 flush 清除,我们使用ip addr del 一次只能删除一个地址 ip addr flush 一次可以删除一堆地址,其使用方式有些类似show,用于处理一个接口上的多个地址。 ip route 路由操作 blackhole黑洞 unreachable 不允许访问(不可达) prohibit 不允许ping 添加路由: ip route add to 10.0.0.0/8 dev eth0(通过的网卡) via 172.168.16.0.1(下一跳,通过此网关GATEWAY) 讲一讲netstat命令: netstat是网络状态/网络统计数据的命令 -r:显示路由表 -n:显示数字地址 -t:已建立的tcp连接 -u:显示udp连接,udp是无状态的,显示不出来,虽然显示不出来已经建立的连接,但是可以显示其它的连接。 -l:显示监听状态的连接 netstat的字段 proto(协议) recv-Q(接收队列) Send-Q(发送队列) local address(本地地址) Foreign address(远程地址,*:*允许任何远程主机连接当前主机) state(状态) netstat -tunl(常用选项) -p 显示监听指定的套接字的进程以及进程名 套接字:IP地址:端口号 给自己讲linux 2017-01-20 评论 1574 次浏览
第五十讲——三次握手与四次挥手 TCP连接的建立得有主动方,发起请求的标志是SYN位置1,SYN同传请求,建立联系的请求。 TCP的重要特色是它的可靠性,所以在任何时刻只要有一个报文出去,报文都有一个号码,当发起请求时这个号码是随机生成的,这个号码就是序列号(sequence number),简称为SN。 TCP建立连接的过程: 1. 主动方将SYN置1(开始的标志),并按一定机制生成序列号SN 2. 接受方收到后也会发送一个报文,将SYN置1(开始的标志),表示响应主动方的请求,并将ACK位置1,ACK为确认位,然后将主动方的SN(序列号)加1后赋予AN确认号(AcknowledgmentNumber),并按照一定机制生成自己的序列号(sequencenumber)SN。 3. 主动方接收到报文后,由于双方都已确认SYN,因此不再置SYN位。打开ACK位,即ACK位置1,将被动方的SN+1后赋予AN(主动方的第二次报文)。 于是连接建立,以后没发送一个数据包都会进行一次确认ACK=1,SN=***,AN=***,中间的过程称为已建立的连接(正常通信的过程),只有前两位SYN=1的过程我们称为新连接建立的过程。图示如下: 四次挥手过程: 四次挥手就是断开连接时的四次确认,断开同样是有主动方与被动方。主动方主动拆除连接,置FIN位为1(FIN为结束标志位)。在断开连接的四次过程中FIN位为1,因为处于连接过程,所以ACK位为1,SN,AN因建立连接后的有效数据传输,所以SN一直存在。图示如下: 在传输协议上(TCP协议上)为应用层协议,应用层协议有http,pop,IMAP,DNS,DHCP……这些应用层协议可能基于TCP使用,也可能使用UDP来完成端到端(进程到进程)的通信,利用IP完成主机到主机的通信,利用底层二层协议完成点到点的通信。应用层的协议就是利用这些来完成自己这个应用本身的服务,所以对整个模型来讲,应用层下的几层被称为通信子网,只是为了完成数据包从发送方到接收方的。而应用层被称为资源子网,为了完成资源共享或者资源的获取等各种功能的,这就是我们的整个网络模型。 给自己讲linux 2017-01-19 评论 1488 次浏览
第四十九讲——TCP层/传输层 在我们的TCP/IP模型中,网络层之上就是传输层。 VFS是沙漏模型(虚拟文件系统)。 TCP/IP协议也是沙漏模型。 假如有一个令牌环网,还有一个10M的以太网,两个网络底层的通信,网卡类型都不相同,此时他们之间如何通信?路由解决了这一底层硬件不同的差异,即不管底层硬件如何,但是到了IP层以后路由的接口必须要能够和本地网络通信才可以。 传输层协议: TCP传输控制协议 UDP用户数据报协议 Ethernet以太网 PPP点对点拨号网络 这些协议最终统一到IP,无论MAC算法是什么。 TCP(Transmission Control Protocol):传输控制协议 UDP(User Datagram protocol):用户数据报协议 TCP为有连接的协议|UDP为无连接的协议。 对于UDP来说,只要将数据报报文放到网络上即可,不管对方是否能够接收到,接收方是否收到报文还需要靠网络和接收方是否在线来决定。 对于TCP来说,要发送报文给对方,会先发送一个试探性的报文,用于提醒接收方接收报文,如果接收方无应答,则数据报文不会发送,如果接收方响应,此时发送方会再发送一个报文用于提醒接收方接收报文。然后开始发送报文,且每一个报文都要确定对方接收无误后才发送下一个报文。即每封报文发送前需要收到上封报文的确认信息,不然不会继续发送。 由于TCP的每一次通信都需要对方确认,这种方式会使数据报文非常可靠,但是也会导致效率低下。所以对于即使通信软件来讲,一般都使用UDP协议,速度快。而对于很多数据可靠性要求较高的情况下,才会使用TCP协议。如QQ,使用UDP协议,它的数据通过应用层得到保证。(服务器应用层的协议来保证数据的到达。) 我们要清楚的是,互联网上的大多数应用是通过TCP来完成的。由于现在的带宽足够大,而且速度也是足够快,因此TCP的使用越来越多。 http、ftp、pop3、SMTP协议都是TCP的。 UDP:使用DNS查询的是UDP协议,DHCP是UDP协议的,TFTP也是UDP的。 上述都是应用层的协议。 TCP协议通信前三次握手建立连接,TCP握手连接后建立起的是一个双向的通道,这个双向通道断开时也需要双向断开。即四次挥手。 断开时总有一方先断开,我们称之为主动断开,或者主动关闭,另一方称为被动关闭。 当主动方发出断开请求后,要产生两段等待,第一段等回应,time-wait1(第一阶段等待),第二段等待被动方说断开,time-wait2(第二段等待)。 TCP Header(TCP首部) 网络防火墙中要使用到,此内容相当重要☆ 依然是一行4个字节(byte),32位。 ·源端口(source port number 16bit) 目标端口(destination port number 16bit) ·序列号(sequence number 32bit)通过一个机制在发起请求时生成一个号码。 ·确认号(ACKnowledgment number 32bit) 首部长度 保留位 紧急位 确认位★ 推送 重置★ 开始★ 结束★ 窗口大小 head lengh reserved URG ACK push PSH RST SYN FIN window、size 4bit 6bit(现为3bit) 1bit 1bit 0无效1存放 1bit 1bit 1bit 1bit 16位 ·TCP checksum(tcp的校验和 16bit) urgentpointer紧急指针(URG位1指针有效,URG位为0指针位为1指针有效) ·Options(可选段) 当多个进程需要发送报文时,会由内核接收,暂时存入缓存,由网卡一个一个向外发送,接收时也一样,先将接收到的放入缓存,一个一个处理,接收速度与接收缓冲有关,发送速度与发送缓存有关,网卡速度也有限。 PSH位有优先传送特权,不放入缓存直接推送。 RST重置,当建立连接时网络抖动了一下(路由器断开了一下),在原来的基础上重新建立连接(不需要像三次握手那样去做。) 窗口大小:接收方本身的缓冲当中剩余的可容纳的报文的个数,以及链路中能总体容纳的个数。解决了发送速度大于接收速度,造成的报文丢失,达成发送,接收平衡。所以发送方一次发多少个要取决于对方(接收方)窗口大小。 给自己讲linux 2017-01-18 评论 1574 次浏览
第四十八讲——IP(逻辑)地址的定义 IP地址为点分十进制的标识方法(IPV4)。其中每8bit分成一组(二进制),共四组,对应32位的二进制,由三个点隔开的四个段。 其中每一个段能够表示的范围为: 0000 0000 – 1111 1111 二进制 0 – 255 十进制 且在整个逻辑地址的基础上,划分为网络地址和主机地址两段。 网络地址.主机地址。 根据主机数目的不同,留给主机使用的空间数目也可以不同。所以为了标识不同规模的网络,IPV4的地址划分了类别,分别用于标记他们的网络地址和主机地址的不同长度。 A类地址:子网掩码为255.0.0.0 简单地说,就是在点分十进制的IPV4中,只有第一段用于标记网络地址,其他都用于标记主机地址。 B类地址: 子网掩码为255.255.0.0 即前两段表示网络地址,后两段表示主机地址。 C类地址: 子网掩码为 255.255.255.0 即前三段表示网络地址,后一段表示主机地址。 虽然我们知道IP地址的类别是这样划分的,但是我们怎么直观的判断它是哪一类的地址? 对于逻辑地址的划分来说,首位逐次向后移动一位,因为为二进制,所以首位为0,所以: A类取值范围为0 000 0001-0 111 1111即1-127,因为网络地址不能为全零,所以从1开始。在127个A类逻辑地址中,127被用于回环地址,所以A类有效地址为1-126.(2^7个网络) B类取值范围为:10 00 0000- 10 11 1111即128-191(2^16[6+8]个网络)。 C类的取值范围:110 0 0000- 110 1 1111 即192-223(2^21[5+8+8]个网络)。 D类地址的范围: 1110 0000 – 1110 1111即224-239,D类地址的网络数为4。 E类为余下的地址。 除开网络地址,余下的为主机地址,当主机位全为0时,为网络地址;当主机位全为1时,当主机位全为1时,为广播地址。所以一个网络中的主机地址中总是有两个是不能够使用的,因此其有效主机个数减2。 我们在互联网上与其他人通信时,地址是不能随意使用的,所以有一个专门的机构来专门分配地址,ICANN,如果我们需要使用数字地址就必须要注册使用(购买)。 地址分配机构预留出了一些地址,只能在本地使用,这些地址称为私有地址。 对于A类地址来说,预留了10段作为私有地址10.0.0.0/8 对于B类地址来说,172.16.0.0/16-172.31.0.0/16 对于C类地址来说,192.168.0.0/24-192.168.255.0/24 这些私有地址都不能直接连接互联网,不会被路由。 路由:其实就是给数据包选路的。 在实际情况中,一个路由连接多个不同的网络,且到达一个目标有多条通路可走。对于不同的路由来说,其考量的标准也是不同的。可以按照经过路由数量最少为标准(太粗糙),还可以以线路的空闲程度来划分,越空闲投递越快。 路由对线路的选择是依靠路由协议来实现的,我们每一条路由条目生成以后,其实都是有自己的cost(成本),哪一个成本低就选择哪一个线路,成本的计算方式也不尽相同(标准不同),所以路由选择时,根据事先设定好的标准以及当前这条路径的开销来选择一个最佳的路径,也就是说所选择的线路未必就是经过路由最少的。 那么问题来了,路又怎么知道到达目的地有哪些路可以进行选择呢? 对于路由来说最核心的就是路由表(路由条目),路由表中有指向关系,只需要知道从哪儿能够到达目标主机就可以了。即下一跳(next hop),下一跳的意思就是将数据交给谁。所以每一个路由都只是关心它的下一跳,但是路由一定要知道到达目标地址要经过哪一个下一跳。 在路由中,每一条信息我们称为路由条目(Entry),在路由条目中,目标地址是一个主机的我们称为主机路由。目标地址是一个网络的,我们称为网络路由。,一般来说是以最佳匹配作为选择标准。 0.0.0.0表示任一主机,这一类我们称为默认路由或者缺省路由。 当一个路由处于骨干网的时候,其中就会包含很多的路由条目,当对一个数据包进行路径的选择时,会消耗硬件资源,所以这对路由的硬件性能就提出了要求。最好能够在硬件内部直接完成判断。 路由汇聚:将子网合并成一个大的子网,其连接接口并不多,通路也不多,但是条目却很多,他可以将相近的网络合并成一个大的网络。 子网:将大的网络划分成子网。 超网:将子网合并成一个大的网络。 超网机制是提升路由性能的一种机制。 子网的概念: 例如我们申请了一个C类的公网的IP,但我们的主机并不多,且只有10台,以4、6的方式分布,且相互之间不能通信。也就是说分别处于两个网络,鉴于公网IP代价昂贵,我们不能再去申请一个IP。 这个时候我们就可以将主机地址中的一部分拿来用作网络位,如果申请的IP为201.1.2.0/24,我们从主机位中拿出两位用作网络位:则 00 000000一共八位,前两位的变化可以是(00/01/10/11四种),但是我们不希望全为0或者全为1,网络位虽然借出去了,但是依旧在内部作为一个整体,划分子网会浪费很多的地址,即使将全为0或者全为1使用上,也会浪费很多地址,即每个网段浪费一个广播地址和一个网络地址。 合并网络:将连续的几个网段合并成一个超网,保证其中某一位,或者某两位能够容纳所有的变化情况。 将IP地址同子网掩码进行逻辑与运算结果为网络地址。 将子网掩码取反同IP地址进行逻辑与运算,结果为主机号。 给自己讲linux 2017-01-17 评论 1669 次浏览
第四十七讲——IP首部 IP首部中有很多的信息,如IP的版本,是IPV4还是IPV6。IP首部的内容如下(每32bit为一行): IPversion(4bit) Hdr les(4bit) type of service(8bit) totallengh(16bit) (IP版本) (首部长度[可变]) (服务类型[优先级]) (整个报文长度) Identfication(16bit) fragment ID(16bit) 标记符 片ID(片标记) 当我们发送报文时,在经过某些设备时,可能不支持较大的数据包,于是将报文拆分,那么问题就来了,当收件人接到拆分的报文怎么处理?我们可以进行猜测,收件人需要对拆分的报文进行重新组装,那么接收的设备又会遇到怎么组装的问题,即要知道拆分的顺序以及哪些片可以组合。 所以当一个报文被切割后它们的标记必须得一样(对于同一个报文来讲)。 fragment offset片偏移,当收到的报文中标记符一致时,说明这些报文要组合成一个,然后按照标记的偏移量来衔接拆分的报文。 (尾)03 02 01(头) 01片的偏移量为0,因为01是头部,02片的偏移量为01的长度,03偏移量的长度为01加上02的长度。 偏移量用来标识自己在整个片上的偏移位置。 fragment前有三位 R、DF、MF MF:更多的片,意思为需整合其他的片,more fragment。 DF:Don’t fragment,不允许切割,为一个完整的报文。 R :暂时先不讲解。 TTL(time-to-live) protocol(协议8bit) header checksum 生存时间(8bit) 用于标记上层协议(tcp、udp等)(首部校验和16bit) TTL定义了报文的投递次数,避免在类似环状路由的情况下一直存在,每经过一个路由该TTL减1,当TTL为0时就不再投递。 每一种协议都有一个标识符用于说明这是什么报文的上层。 我们的首部生成以后,会将校验码提出来(计算出来),放到校验和的位置,因为报文在传输的过程中有可能会出错(干扰,或者设备本身的内部错误导致。)校验和采用了单项加密的机制,即只要数据一样,结果一定一样,如果结果不一样,数据是一定不一样的。 source IP address 源IP(32位) destination IP address 目标IP(32位) options(可选)最大长度为40字节 data(数据)包含传输层首部、应用层首部。 OSI模型其实只是一个参考模型,我们常用的是TCP/IP模型。 TCP/IP模型(现实中正在使用的模型),有五层。(五层模型) 应用层——对应OSI中的(应用层、表现层、会话层) 传输层 网络层(互联网层) 链路层 物理层 IP首部,在IP header中,每32bit当做一个组织(单元)来进行使用和理解,这就意味着每个是4个字节(32bit)一行。 我们通常说包长度的时候指的是有多少行,(一共有多少个单元[行],而不是有多少个字节)。即header length(首部长度)标记的不是字节数二是行数,最大能够标记2^4-1行,这也是为什么可选项最大只能为40字节的原因,最大能够标记15行(60个字节),前面的各种数据占用20个字节(5行),在互联网上,不同设备他们彼此之间所支持的报文大小可能是不一样的,这取决于MTU,MTU:最大传输单元,所以在不同的设备上,其MTU是有差异的。 给自己讲linux 2017-01-16 评论 1470 次浏览