第五十一讲——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 评论 1575 次浏览
第五十讲——三次握手与四次挥手 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 评论 1491 次浏览
第四十九讲——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 评论 1576 次浏览
第四十八讲——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 评论 1671 次浏览
第四十七讲——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 次浏览
第四十六讲——逻辑地址(IP) 为什么主机能够知道接收方是否和发送方在同一网络?我们这一讲带着这个疑问进行学习。 我们的逻辑地址是使用点分十进制表示的四段,这个逻辑地址被分为两段,网络地址和主机地址。网络地址用于标识不同的网络,主机地址用于标识本地网络内不同的主机。为了将网络地址和主机地址能够被识别,我们还需要请出子网掩码这把杀猪刀,就是它将一个完整的逻辑地址一刀劈成两段,你一段,我一段……当然这是开玩笑的。 网络地址 主机地址 通过子网掩码的和逻辑地址的运算,就可以得出网络地址和主机地址,我们也就可以通过子网掩码进行判断,逻辑地址中的哪一段是网络地址,哪一段是逻辑地址。 子网掩码:子网掩码的格式同逻辑地址,只是子网掩码的数值比较特别。当子网掩码转换成二进制时,应当是连续不断的1组成,其余为0。例如 十进制的子网掩码可以为255.255.255.0,将其展开成二进制为 1111 1111 . 1111 1111 . 1111 1111 . 0000 0000 这就是24位连续的1。 我们为了方便记忆和使用,将二进制的数字转换成了十进制,所以在将子网掩码和逻辑地址进行与运算之前,我们要先将子网掩码和逻辑地址转换成二进制。然后再进行与运算。 在与运算中,0和1相与得0,1和1相与得1,0和0相与得0。 我们的逻辑地址的每一段的取值为0-255,即每一段为八位二进制表示 0000 0000 为最小 十进制为0 1111 1111 为最大 十进制为255 所以主机在通信之前将IP同子网掩码进行与运算,如果源地址与接收方的网络地址一样,则在同一个网络,否则主机不在同一个网络,这时就需要通过网关进行转发。 所以任何时候,网络中的主机要同网关在同一网络中,才能实现网关接收数据并进行转发。在路由上,也有将IP地址同子网掩码相与得过程,用于判断接收方的IP地址是否在同一网络中。 一个交换机可以连接多个不同的冲突域。 一个路由可以连接多个不同的广播域。 在路由也像交换机一样,内部维护有一张表,里面记录了(维护了)要到达什么地方通过哪个接口。这张表称为路由表。 在这张图中,1.1要与4.1通信,首先1.1的主机要将自己的IP地址同子网掩码相与,再将目标地址与子网掩码相与,判断两主机是否存在于同一网络,如果不在同一网络则将数据包转发给路由R1,R1在路由表中查询(通过手动指定指向关系),知道到达4.1主机所在的网络需要进过路由R2,于是路由R1将数据转发给R2,R2在接收到数据后通过查看报头比对IP(同源码进行与运算),发现不在本地网络,于是查路由表知道通过路由R3能够到达4.1所在主机的网络,将数据转发给路由R3,R3接收到数据后,进行IP比对,在路由表中查询4.1所在网络的端口(网关),并通过该端口将数据转发给交换机(switch4),交换机收到数据后进行广播通知4.1主机,取得4.1主机的回应(取得MAC地址)后,将源地址MAC和4.1主机MAC封装报文,发送给4.1主机。于是4.1主机收到以后拆开数据报文,获得数据中的内容。 路由具有自动学习的功能,其利用某种协议(RIP2、USPF等),假设在某一传输线路上某一设备故障,那么之前学习的内容是有效的,导致数据始终发送给故障的设备,导致数据无法到达,所以路由自动学习是实时的,当某个链路不通时,可以快速的响应并删除其指向。 如果是在一个主机相对稳定的环境中,应当采用手动指定的方式,指定路由的对应关系,如果在这种环境中使用动态学习,则会占用一些硬件资源,并且需要一定的时间。所以东财学习常常使用在主机经常变动的网络。 在路由器中,由于某个条目的改变,整个链路从一种状态转换成另一种稳定状态之前的过程,我们称为路由表的收敛过程。 路由协议(RIP2、OSPF等),他们支持的网络规模不同,其收敛时间也不同,算法也不一样,生成路由表的效率也会不一样。所以路由器要以什么样的协议去学习需要根据需要选择。 IP为被路由协议。在整个的传输过程中,IP地址都不会改变,从而实现了主机到主机的通信,能标识主机和目标主机。 MAC:本地网络设备之间的通信,物理设备之间的通信,它的范围不能超出本地网络。 在我们的主机上,并不是说网卡与网卡进行通信,我们要知道,网卡只是一个传输的介质,其实际上是运行在主机上的进程(运行在主机上的程序称为进程)之间的通信,这些进程依赖网卡与其他主机的进程进行通信。 而且,每一个主机上都是由多个进程的,因此,我们为了标识主机上哪个进程与其他的进程,还需要一个地址。这个地址就是端口号,通过不同的端口号来标识不同的进程。 每一台主机上的可用端口为0-65535之间的端口,端口与进程之间没有必然的联系,这就意味着对方的进程工作的端口不确定。 于是对这些端口就进行了规范,用于定义端口的服务,这个规范的定制者为国际上的名称地址分配机构。 例如80端口分配给WEb服务,一些著名的服务应当有固定的服务端口,而不能随意的使用其他的端口,以确保能为他人提供服务(服务端)。 对于客户端来说,使用的额端口是随机的,没有被使用的端口。且一个端口只能属于一个进程,且这个进程会对端口进行监听。 对于服务端端口来说来说,端口是被动打开的,对客户端来说访问服务端端口是主动打开。 为了使数据能够到达目的地,端口与IP地址相关联,且与MAC地址县关联。 如果本地主机上有两块网卡,且每块往卡上都有IP地址,都可以使用各自的端口,也就是说两个地址就有相同的端口可以使用且不相互影响,因为端口同IP、MAC相关联。对于当前主机如何区分相同端口的不同IP信息?这就意味着必须将IP同端口绑定起来,这种绑定叫做套接字。 IP:port 绑定起来的一组称为SOCKET,一个套接字。 所以在将来我们启动某个进程的时候,监听在某个套接字上,也就是说启动一个WEB服务器,这个WEb服务的进程将监听这个地址的80端口,这就意味着这个主机就跟这个地址的80端口绑定起来了,也就意味着和这个套接字绑定起来了。 我们不能手动绑定,而是通过某个进程将IP和端口进行关联到这个进程上。从而实现主机间的通信。 例如A主机发送一个报文到目标主机的80端口,只要报文能够到达B主机,B主机的80端口就能够接收到报文。 我们的主机在通信时所加的port、IP、MAC信息在接收方能够正确理解才能实现信息的传输,因此主机之间就需要一种约定,也就是协议。 这些协议就是互联网通信中的关键几环,而这些协议每一个对应的步骤是根据对方的那个相同的功能建立关联关系的,发送方的IP由接收方解析,MAC由对方解析,端口由端口解析,也就是说每一个都称为一个子系统,或者子功能,专门用于管理IP、MAC、端口,这个就叫做协议的分层。将一个大的任务划分为小的任务。 协议的层级结构以OSI七层模型为例: OSI由国际标准化组织ISO提供,将一个报文从源地址到目标地址要经过的所有过程分为7个子功能 应用层——具体的应用 表示层——加密解密,是否压缩等等 会话层——双如何建立回话 传输层——封装源端口、目标端口 网络层——封装IP(源IP、目标IP) 链路层——封装源MAC和目标MAC 物理层——用于封装数据报文的首部,这一步会封装一大串的1或者0,用于分割报文,称为报文的前导码。 虽然我们通过端口能到达对方的WEB服务器,但是对方的WEb服务器也可以提供多个网页(一个站点上可能会有多个网页)标识同一服务上的不同页面就需要应用层协议,例如HTTP协议(应用层协议)。 给自己讲linux 2017-01-15 评论 1627 次浏览