TCP/IP五层模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- 应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。
- 传输层(操作系统的内核):负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。
- 网络层(路径选择,也是操作系统的内核):负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。
- 数据链路层(相邻节点的传输情况,网卡/驱动程序):负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。 有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。
- 物理层(硬件设备):负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。
网络设备所在的分层:
- 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四层;
- 对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层;
- 对于一台交换机,它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层;
- 对于集线器,它只实现了物理层;
一、应用层:
1. DNS,即Domain Name System,域名系统。
DNS是一整套从域名映射到IP的系统。
TCP/IP中使用IP地址来确定网络上的一台主机,但是IP地址不方便记忆,且不能表达地址组织信息,于是人们发明了域名,并通过域名系统来映射域名和IP地址。
域名是一个字符串,如 www.baidu.com
域名系统为一个树形结构的系统,包含多个根节点。其中:
-
根节点即为根域名服务器,最早IPv4的根域名服务器全球只有13台,IPv6在此基础上扩充了
数量。 -
子节点主要由各级DNS服务器,或DNS缓存构成。
DNS域名服务器,即提供域名转换为IP地址的服务器。
浏览器、主机系统、路由器中都保存有DNS缓存。
Windows系统的DNS缓存在 C:\Windows\System32\drivers\etc\hosts 文件中,
Mac/Linux系统的DNS缓存在 /etc/hosts 文件中
网络通信发送数据时,如果使用目的主机的域名,需要先通过域名解析查找到对应的IP地址:
1. 域名解析的过程,可以简单的理解为:发送端主机作为域名系统树形结构的一个子节点,通过域名信 息,从下到上查找对应IP地址的过程。如果到 根节点(根域名服务器)还找不到,即找不到该主机。
2. 域名解析使用DNS协议来传输数据。DNS协议是应用层协议,基于传输层UDP或TCP协议来实现
2. NAT
IP地址是32位的整数2^32,不够用怎么办:
NAT机制:让IP地址代表一批设备,让IP地址分成了局域网IP和广域网IP
局域网:内部的IP不能重复,不同局域网的内网IP可以重复。10.、172.16~172.32、192.168.这些就是局域网常见IP开头
广域网:不能重复,必须唯一
NAT机制使得内网设备能够主动访问外网设备,但外网设备不能主动访问内网设备
关于NAT机制图解:
用户设备发送信息出去,源IP会被运营商路由器进行替换成一个广域网IP
3. NAPT
如果局域网内,有多个主机都访问同一个外网服务器,那么对于服务器返回的数据中,
目的IP都是相同的
接收服务器回应时运营商路由器也会进行替换,同一个局域网的设备会被替换成同个广域网IP,此时目标设备会根据不同的端口号来区分,如果是同个端口,运营商路由器会替换成不同的端口。这就是NAPT机制
开发中常见的格式
- xml:通过标签来组织数据,需要有开始标签和结束标签
- json:(目前最流行的数据组织格式)
键值对结构:{}将所有键值对包裹起来
键值对之间使用“,”来分割
键和值之间使用“:”来分割
键固定是string
可读性高比xml简洁,但会消耗额外的带宽(key也要进行传输) - protobuffer:使用二进制来组织数据,带宽占用最低,虽然传输效率最高,但可读性差,开发效率受影响
二、传输层重点协议
UDP:
UDP协议端格式:
- 16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度;
- 如果校验和出错,就会直接丢弃
什么是校验和
网络传输中由于外部干扰可能出现数据传输出错,因此需要一种检查手段来识别出错的数据(校验和)
如何基于校验和来检验数据:
- 发送方将数据整理成data1,并且通过一定的算法计算出校验和checksum1,然后一起发送出去
- 接收方收到数据data2和checksum1,通过data2计算出checksum2
- 对比checksum1和checksum2是否相同,不同的话data1和data2一定不同,反之大概率相同
校验和是如何计算的:
- CRC算法(循环冗余算法):
把要计算校验和的数据每个字节进行累加,把结果保存到这两个字节中的变量,如果溢出也无所谓(不是特别靠谱,可能仍然相同) - md5/sha1算法:
通过一系列公式生成,
1. 定长:长度固定
2. 分散:细微差别的结果差异大
3. 不可逆:不能还原成原始数据
UDP的特点:
- 无连接:
知道对端的IP和端口号就直接进行传输,不需要建立连接 - 不可靠:
没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层任何错误信息。 - 面向数据报:
应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并; - 全双工:
UDP的socket既能读又能写 - 大小受限:
UDP协议首部中有一个16位的最大长度。也就是说一个UDP能传输的数据最大长度是64K(包含UDP首部)。 - 缓冲区
UDP没有真正意义上的 发送缓冲区。发送的数据会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作;
UDP具有接收缓冲区,但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致;如果缓冲区满了,再到达的UDP数据就会被丢弃
基于UDP的应用层协议:
NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议
DNS:域名解析协议
TCP:
TCP,即Transmission Control Protocol,传输控制协议
报头最短20字节(没有选项),最长60字节(选项40字节)
- 源/目的端口号:表示数据是从哪个进程来,到哪个进程去;
- 32位序号/32位确认号:确认应答机制中用到;
- 4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是15 * 4 = 60
- 6位标志位:
URG:紧急指针是否有效
ACK:确认号是否有效
PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段- 16位窗口大小:后面再说
- 16位校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含TCP首部,也包含TCP数据部分。
- 16位紧急指针:标识哪部分数据是紧急数据;
TCP的特点:
- 有链接:通信前建立连接
- 可靠传输:存在重要机制来保证传输的可靠性
- 面向字节:面向字节流
- 双全工:允许双向通讯
重要机制(保证可靠传输):
-
确认应答(安全机制)
如何确认数据包是普通数据还是ack应答报文:6位标志位中的ack位是否为1
TCP将每个字节的数据都进行了编号。即为序列号。
每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开
始发。TCP如何保证可靠传输的??
通过确认应答为核心,借助其他机制辅助最终完成可靠传输 -
超时重答
丢包的情况:数据丢失、返回的ack丢了,重传能够大幅度地提升数据能被传过去的概率
什么时候重传?
超过了等待时间就重传(初始的等待时间在不同系统上都不一样(可配置),每经历一次超时,等待的时间都会变长,但如果时间一直增长的话就会放弃tcp连接(触发tcp重置连接操作))
TCP存在一个接收缓冲区(去除重复数据,保证数据可靠性),会保存当前收到的数据,以及数据的序号;如果接收方收到一个已经存在的数据,就会把这个后来的数据丢弃掉,确保read的时候只读到一个数据 -
连接管理(安全机制)
在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接通常发起请求的是客户端
完整的连接管理中服务器的状态转化:三次握手阶段:
[CLOSED -> LISTEN]
服务器端调用listen后进入LISTEN状态,等待客户端连接;
[LISTEN -> SYN_RCVD]
一旦监听到连接请求(同步报文段),就将该连接放入内核等待队列中,并向客户端发送SYN确认报文。
[SYN_RCVD -> ESTABLISHED]
服务端一旦收到客户端的确认报文,就进入ESTABLISHED状态,可以进行读写数据了。
四次挥手阶段:
[ESTABLISHED -> CLOSE_WAIT]
当客户端主动关闭连接(调用close),服务器会收到结束报文段,服务器返回确认报文段并进入CLOSE_WAIT;
[CLOSE_WAIT -> LAST_ACK]
进入CLOSE_WAIT后说明服务器准备关闭连接(需要处理完之前的数据);当服务器真正调用close关闭连接时,会向客户端发送FIN, 此时服务器进入LAST_ACK状态,等待最后一个ACK到来(这个ACK是客户端确认收到了FIN)
[LAST_ACK -> CLOSED]
服务器收到了对FIN的ACK,彻底关闭连接。客户端的转化:
三次握手阶段:
[CLOSED -> SYN_SENT]
客户端调用connect,发送同步报文段;
[SYN_SENT -> ESTABLISHED]
connect调用成功,则进入ESTABLISHED状态,开始读写数据;
四次挥手阶段:
[ESTABLISHED -> FIN_WAIT_1]
客户端主动调用close时,向服务器发送结束报文段,同时进入FIN_WAIT_1;
[FIN_WAIT_1 -> FIN_WAIT_2]
客户端收到服务器对结束报文段的确认,则进入FIN_WAIT_2,开始等待服务器的结束报文段;
[FIN_WAIT_2 -> TIME_WAIT]
客户端收到服务器发来的结束报文段,进入TIME_WAIT,并发出LAST_ACK;
[TIME_WAIT -> CLOSED]
客户端要等待一个2MSL(Max Segment Life,报文最大生存时间)的时间,才会进入CLOSED状态。三次握手:
客户端是A,服务端是B
第一次握手(上图的1和2):如果成功则 :B知道A的发送没问题,B的接收没问题
第二次握手(上图的2和3):A知道自己的发送和接收没有问题,B的接收和发送没有问题
第三次握手(上图的3和4):B知道A的接收和发送没有问题,自己的发送没问题
三次握手使得AB都确认了自己的发送和接收能力都没有问题
syn:没有载荷(特殊的TCP数据包)
三次握手要解决什么问题?四次握手是否可行?两次呢?
作用:1. 投石问路,确认网络是否通畅 2. 发送方和接收方确认自己的发送和接收能力是否有问题 3. 重要的参数进行协商,tcp通信中的序号从几号开始,就是双方协商出来的,每次建立连接的时候都会协商出一个比较大的,和上次不一样的序号(网络不好的时候会断开连接,在重新建立连接,重连的时候,新连接好了,但上次传输的旧数据收到了就会通过序号的比对来进行丢弃)
四次:可以但没必要,将两个数据合并成一个数据提高效率
二次:接收方知道的信息不完全四次挥手:如上图所示
中间服务器向客户端发送ACK和FIN不能合并在一起:ACK和第二个FIN的触发时机不同,ACK是内核响应的,服务端收到FIN就会立即返回ACK;而第二个FIN是应用程序的代码触发B这边调用close方法触发的,期间的时间是不确定的。(三次握手ACK和SYN都是内核触发的,同一个时机所以可以合并)
TIME_WAIT等待多久?
假设网络上两个节点通信消耗的最大时间为MSL(可配置)
等待时间为2MSL(上限) -
滑动窗口(效率机制)
前三个操作时保证可靠性,这个操作是提高效率的
TCP的可靠传输会影响传输效率,所以TCP只要引入了可靠传输,传输效率就不可能超过没有可靠性的UDP,这里是为了缩短传输效率的差距窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。上图的窗口大小就是4000
个字节。
发送前四个段的时候,不需要等待任何ACK,直接发送;
收到第一个ACK后,滑动窗口向后移动,继续发送第五个段的数据;依次类推;操作系统内核为了维护这个滑动窗口,需要开辟 发送缓冲区 来记录当前还有哪些数据没有应
答;只有确认应答过的数据,才能从缓冲区删掉;
窗口越大,则网络的吞吐率就越高;-
如果ack丢了
确认序号的含义是,该序号以前的都收到了,如果收到2001,但1001丢了是不影响的(覆盖)
-
数据包控制
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
当某一段报文段丢失之后,发送端会一直发 1001 这样的ACK.
如果发送端主机连续三次收到了同样一个 “1001” 这样的应答,就会将对应的数据 1001 -
2000 重新发送;
这个时候接收端收到了 1001 之后,再次返回的ACK就是7001了(因为2001 - 7000)接收端
其实之前就已经收到了,被放到了接收端操作系统内核的接收缓冲区中;
这种机制被称为 “高速重发控制”(也叫 “快重传”)。
-
-
流量控制(安全机制)
站在接收方的角度,反向制约发送方的数据,发送方速率不能超过接收方的处理能力-
接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段,通过ACK端通知发
送端 -
窗口大小字段越大,说明网络的吞吐量越高; (接收方的缓冲区大小作为衡量处理能力的指标)
-
接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端;发送端接受到这个窗口之后,就会减慢自己的发送速度;
-
如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一
个窗口探测数据段(不携带业务数据),使接收端把窗口大小告诉发送端。(如果不为0就继续发送数据)十六位窗口大小不一定只能表示64k,可进行扩容
TCP首部40字节选项中还包含了一个窗口扩大因子M,实际窗口大小是 窗口字段的值左移 M
位
-
-
拥塞控制(安全机制)
流量控制是考虑接收方的情况,而拥塞控制是考虑通信过程中的中间节点的情况
中间节点难以量化,所以采用实验的方式,将窗口从小往大调整,如果中间节点有问题就会丢包,发现丢包后,就会调小,如果还丢包就继续缩小,不丢包就变大,通过动态调整,找到中间节点的瓶颈
流量控制和拥塞控制都是在限制发送方的发送窗口大小,最终时机发送的窗口大小是取流量控制和拥塞控制中的窗口较小值
-
延时应答(效率机制)
本质上是为了提升传输效率,发送方的窗口大小就是传输效率的关键
流量控制就是接收缓冲区剩余空间,来决定发送效率的,如果能够有办法让这个流量控制得到的窗口更大点(能处理来的情况),发送速率就更快
延时返回ack,给接收方更多的时间来读取接收缓冲区数据,此时接收方读取这个数据后,缓冲区的剩余空间就会变大,返回的窗口也会变大具体说明下:
假设接收端缓冲区为1M。一次收到了500K的数据;如果立刻应答,返回的窗口就是500K;
但实际上可能处理端处理的速度很快,10ms之内就把500K数据从缓冲区消费掉了;
在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过
来;
如果接收端稍微等一会再应答,比如等待200ms再应答,那么这个时候返回的窗口大小就是
1M一般超时时间取200ms
-
捎带应答(效率机制)
在延时应答的情况下进一步提高效率,很多情况下,客户端服务器在应用层也是 “一发一收” 的。客户端给服务器说了 “How are you”,服务器也会给客户端回一个 “Fine, thank you”;
那么这个时候ACK就可以搭顺风车,和服务器回应的 “Fine,thank you” 一起回给客户端 -
面向字节流
面向字节流的机制都可能存在粘包问题,包指的是应用层数据,如果同时多个应用层数据包被传输出去就可能出现粘包问题(应用程序看到了这么一连串的字节数据,就不知道从哪个部分开始到哪个部分,是一个完整的应用层数据包。 )
应用程序就不知道缓冲区里的数据从哪里得到一个完整的应用数据包
UDP面向数据报传输就没有上述问题(独立的DatagramPacket)
如何解决:1. 引入分隔符 2. 引入长度
通过这两个就明确了包与包的界限和包的结束位置
-
异常情况的处理:
- 进程崩溃:
进程没了,异常终止,文件描述符表释放,相当于调用socket.close(),触发FIN(正常四次挥手断开连接的过程)
TCP的连接可以独立进程的存在 - 关机
关机时会触发强制终止进程的操作,相当于1,此时触发FIN,对方收到后,自然就会返回ACK和FIN,但此时系统可能已经关闭,ACK和FIN迟到无法进行后续的ACK响应,站在对端的角度,对端以为自己FIN丢包了,重传FIN,重传几次没有响应自然就会放弃连接 - 断电
来不及杀进程就断开,此时没有发送ack,如果对端是在发送数据,发送的数据就会一直等待ack, - 触发超时重传,触发TCP的重置连接功能,发起复位报文段,如果复位报文段发过去后也没有效果,此时会释放连接
- 如果对端在接收数据,接收方会周期性的给发送方发起一个特殊的,不携带业务数据的数据包(心跳包),并期望对方返回一个应答,并且重复多次后仍然没有,就可以单方面释放连接了
TCP的心跳机制:周期比较长。开发中用到的心跳一般是毫秒级的,都是在应用程序中自租实现的,而不是用TCP的 - 网线断开:和主机掉电一样
- 进程崩溃:
TCP和UDP的对比:
TCP优势:可靠传输,适用于大部分场景
UDP优势:效率更高,更适于可靠性不敏感,性能敏感的场景(局域网的主机间通信,同一个机房内部网络结构简单,带宽充足,网络设备负载低,丢包概率小,效率要求高)
传输数据比较大的数据报,TCP合适,UDP有64kb限制
广播传输:UDP(支持天然广播,即将数据发送给局域网的所以机器)投屏功能也适用UDP
三、 网络层重点协议
网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信。
IP协议(地址管理,路由选择):
- 4位版本号(version):指定IP协议的版本(IPv4、IPv6),对于IPv4来说,就是4。
- 4位头部长度(header length):IP头部的长度是多少个32bit,也就是 length * 4 的字节数。4bit表示最大的数字是15,因此IP头部最大长度是60字节。
- 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。
- 16位总长度(total length):IP数据报整体占多少个字节。
- 16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
- 3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。
- 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。
- 8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
- 8位协议:表示上层协议的类型。
- 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。
- 32位源地址和32位目标地址:表示发送端和接收端。
选项字段(不定长,最多40字节)
地址管理:
IP地址是32位的整数2^32,不够用怎么办:
- 动态分配IP
- NAT机制:让IP地址代表一批设备,让IP地址分成了局域网IP和广域网IP
局域网:内部的IP不能重复,不同局域网的内网IP可以重复。10.、172.16~172.32、192.168.
广域网:不能重复,必须唯一
用户设备发送信息出去,源IP会被运营商路由器进行替换成一个广域网IP,接收时运营商路由器也会进行替换
同一个局域网的设备会被替换成同个广域网IP,此时目标设备会根据不同的端口号来区分,如果 是同个端口,运营商路由器会替换成不同的端口。
NAT机制使得内网设备能够主动访问外网设备,但外网设备不能主动访问内网设备 - IPv6:使用16个字节来表示IP地址
分包和组包
MTU相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层,产生的限制。不同的数据链路层标准的MTU是不同的;
1. 为什么分包:
IP 数据包需要进行分包的主要原因是网络传输中的限制(带宽不足或路由MTU限制),将数据包分为更小的片段就可以解决限制问题,
分割后的每个片段可以更容易地在网络中传输,因为它们更小。可以同时通过不同的传输路径进行发送,从而提高数据的传输速度和可靠性。IP 数据包分包是一种优化网络传输的有效方式。
如果不分割可能会造成的数据包丢失和损坏,引起延时或者中断,而且较大的数据报也会占用更多的带宽引起网络拥塞
2. 和那些IP报头字段有关,这些字段是如何保证组包时数据的完整性的?
- 标识符字段(Identification):用于标识数据包的唯一性。在分包过程中,每个片段都应该具有相同的标识符。
- 片偏移字段(Fragment Offset):指示当前片段在整个原始数据包中的位置。例如,偏移量为 0 的片段包含数据包的头部。在分包过程中,每个片段都需要设置正确的偏移量,以便在组装时能够重新构建完整的数据包。
- 标志位字段(Flags):标志位字段中最重要的是“更多片(more fragments)”标志,它用于指示是否还有更多的 IP 片段等待接受。如果更多片位设置成 1,说明还需要等待其他IP 片段的到来,如果设置成 0,则说明这是最后一个 IP 片段。
- 协议字段(Protocol):协议字段用于指示 IP 数据报携带的数据的协议类型
- 校验和字段(Header Checksum):校验和字段用于校验 IP 报头中的数据是否被更改或损坏。
IP地址
IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址;
IP地址分为两个部分,网络号和主机号
网络号:标识网段,保证相互连接的两个网段具有不同的标识;
主机号:标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;
子网掩码就是来确定网络号的
曾经提出一种划分网络号和主机号的方案,把所有IP 地址分为五类(ABCDE)
A 类
0.0.0.0 ~127.255.255.255
B 类
128.0.0.0 ~191.255.255.255
C 类
192.0.0.0 ~223.255.255.255
D 类
224.0.0.0 ~239.255.255.255
E 类
240.0.0.0 ~247.255.255.255
子网掩码
32位整数,左侧都是1,右侧都是0,不会出现10交替如255.255.255.0(1111 1111 1111 1111 1111 1111 0000 0000)
将 IP 地址和子网掩码进行“按位与”操作(二进制相同位,与操作,两个都是1结果为1,否则为0),得到的结果就是网络号。
将子网掩码二进制按位取反,再与 IP 地址位与计算,得到的就是主机号。
如果IP地址的主机号全为0,当前地址就表示为网络号
192.168.100.0
255.255.255.0
主机号全为1就是广播地址:
192.168.100.255
255.255.255.0
127开头的是环回IP,表示设备自身
路由选择
一个网络层的数据报每次到达一个路由器,就会进行查表(根据数据报终中的目的IP,查路由表),查到了就按表走,没有就到下一跳地址(默认表项)
四、数据链路层
以太网
“以太网” 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了
一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等;
以太网帧格式
以太网的帧格式如下所示:
帧头+载荷+帧尾
- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固定的(不能修改、唯一);
- 帧协议类型字段有三种值,分别对应IP(数据链路层的数据报能带最大数据MTU:1500)、ARP、RARP;
- 帧末尾是CRC校验码
IP地址关注的是源地址和目的
mac地址关注的是相邻节点