在极客时间上学习刘超老师的趣谈网络协议这门课,听看的时候嗯。。。觉得自己已经很懂了,理解得也还行。但是当自己整理时会发现有好多小知识点并没有完全理解。。。这篇博客呢就是在听课后再加上谷歌搜索整理得来。权当学习笔记了,顺便巩固记忆,以后忘了还可以再翻翻。(ps: 未完结。。。持续更新ing)
目录
当你在浏览器中输入一个网址并按回车之后到浏览器页面显示的过程中间发生了什么呢?
1.浏览器通过地址簿协议DNS或HTTPDNS(更加精准)查找该网址对应的ip地址。
2.浏览器使用HTTP或HTTPS协议打包请求并通过socket编程交给传输层。
3.传输层的协议有无连接的UDP和面向连接的TCP。那么何为面向连接呢?就是如果请求的传输过程中出现问题不需要浏览器再进行请求打包,传输层会自己默默地重新请求,直到传输过程没问题为止。TCP头包含两个端口,客户端浏览器监听端口和目标服务器监听端口。
4. 传输层将包封装后,浏览器将包交给操作系统的网络层,网络层的协议是ip协议。IP头包含客户端浏览器的IP地址和目标服务器的IP地址。
5. 如果目标IP是非本地IP, 操作系统找网关,网关的默认地址为192.168.1.1。操作系统找网关的协议是ARP协议。广播给局域网内的所有主机。网关收到后返回给操作系统网关的MAC地址。于是操作系统就将IP包交给MAC层。
6. MAC层封装IP包,使其包含客户端电脑MAC和网关的MAC。网卡再通过网关的MAC地址将包发给网关。网关收到包后,会根据自己的知识,判断下一步该怎么走,网关往往是一个路由器,到某个IP地址应该怎么走会有一个路由表来提供的。
7. 找对应IP所在的网关的沟通协议是路由协议,常用的有OSPF和BGP。当他到达最后一个网关,网关会给他目标IP对应MAC地址。通过这个MAC地址就能找到目标服务器。
8. 目标服务器接收到这个MAC包后发现是自己的MAC地址,就取下MAC头发送给操作系统的网络层。发现IP也是自己的,就取下IP头发送给传输层即TCP协议的那层。
9. 在TCP层,对于每个收到的包,都会有一个回复的包说明收到了。这个回复会沿着刚才来的方向走回去。如果发送端的TCP层没有收到这个回复,就会重新发送请求包。
10. 当网络包平安到达TCP层后,TCP头中有目标端口号,知道了这个端口号,操作系统往往通过远程调用的方式来发给目标网站的对应进程,然后对应进程就收到的请求的内容,并根据自己的程序进行处理。当处理完毕,就会回复一个对应的HTTP或HTTPS包,像来的时候一样回复给发送端。
协议三要素:语法,语义,顺序
层 | 用到的协议 |
---|---|
应用层 | DHCP, HTTP, HTTPS, RTMP,P2P, DNS,GTP,RPC |
传输层 | UDP, TCP |
网络层 | ICMP, IP, OSPF, BGP, IPSec, GRE |
链路层 | ARP, VLAN, STP |
物理层 | 网络跳线 |
因为网络包的格式很复杂, 这个程序也很复杂。复杂的程序都要分层,这是程序设计的要求。
对于TCP协议来说,三次握手也好,重试也好,只要想发出去包,就要有IP层和MAC层,不然是发不出去的。只要是在网络上跑的包,都是完整的。可以有下层没上层,但绝对不能有上层没下层。
一个HTTP协议的包经过一个二层设备,二层设备收进去的是整个网络包。这里面HTTP, TCP, IP, MAC都有。二层设备就是只是把MAC头摘下来,看看到底是丢弃、转发,还是自己留着。
就是把MAC头摘下来之后,再把IP头摘下来,看看到底是丢弃、转发还是自己留着。
ifconfig 是Linux和MAC上查看IP的命令,windows上是ipconfig。 Linux上还有一个命令ip addr也可以查看IP地址。
(来自: ifconfig和ip addr的区别)
ifconfig和ip addr分别代表了ip alias 和 secondary IP两种机制。每个IP地址都有一个网卡alias,还有一个标志位表示是primary还是secondary IP.
IP的网卡alias就是/etc/networking/interfaces里那些eth0:0,eth0:1……这些虚拟的网卡名称仅仅是为了给一块网卡添加多个IP地址。secondary IP是独立的另一套机制。同一块网卡上的多个IP, 只要网络号(网段)不一样,就都是primary IP.
输入ip addr 得到的内容如下:
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1450 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:f3:f8:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.3/20 brd 192.168.15.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fef3:f813/64 scope link
valid_lft forever preferred_lft forever
如上输出, 192.168.0.3就是IP地址(私有),IP地址被点分为四个部分,每个部分8个bit,所以IP地址总共是32位。在IP地址后面有个scope, 对于eth0这张网卡来讲,是global,说明这张网卡是可以对外的,可以接收来自各个地方的包。对于lo来讲,是host, 说明这张网卡仅仅可以供本机相互通信。lo全称是loopback, 又称环回接口,往往会被分配到127.0.0.1这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现。
IP起初被分为五类,但这样IP肯定是不够用的,然后就有了IPv6,如上图的inet6 fe80::f816:3eff:fef3:f813/64,有128位,这个暂时是够用了。
ABC三类地址所能包含的主机数量
1 A类
除去第一位全为1的被设置为保留地址,不能分配
所以A类IP地址的网络个数最大为2^7-2=126
网络号范围为:0000 0001 ~ 0111 1110 即1 ~ 126
IP地址范围就是0.0.0.1 ~ 126.255.255.255
主机号占24位,但全0和全1的主机号不可分配。所以最大主机数为:2^24 - 2 = 16777214
2 B类
除前两位外,后面全为0的网络号不可用
最大网络数为: 2^14-1
网络号范围为:1000 0000 0000 0001 ~ 1011 1111 1111 即128.1 ~ 191.255
IP地址范围就是:128.0.0.1 ~ 191.255.255.255
主机号占16位, 同样全为0和全为1的不可分配,因些最大主机数为: 2^16 - 2 = 65534
3 C类
除前两位外,全为0的网络号不可用
最大网络数为:2^21 - 1 = 2097151
网络号范围为:1100 0000 0000 0000 0000 0001 ~ 1101 1111 1111 1111 1111 即192.0.1 ~ 233.255.255
IP地址范围就是:192.0.0.1 ~ 233.255.255.255
主机号占8位,同样全为0和全为1的不可分配,因此最大主机数为: 2^8 - 2 = 254
汇总(私有IP地址范围还不太理解是怎么来的):
类别 | IP地址范围 | 最大主机数 | 私有IP地址范围 |
---|---|---|---|
A | 0.0.0.1~126.255.255.255 | 16777214 | 10.0.0.0~10.255.255.255 |
B | 128.0.0.1~191.255.255.255 | 65534 | 172.16.0.0~172.31.255.255 |
C | 192.0.0.1~223.255.255.255 | 254 | 192.168.0.0~192.168.255.255 |
五类IP的分类还有一个尴尬的事情, 就是C类地址能包含的最大主机 数量实在是太少了,只有254个。现在估计一个网吧都不够用了。而B类地址能包含的最大主机数量又太多了。6万台机器放在一个网络下,一般的企业基本达不到这个规模,闲着的地址就是浪费,于是就有了一个折中的方式叫做无类型域间选路。这种方式打破了原来设计的几类地址的做法,将32位的IP地址一分为二,前面是网络号,后面是主机号 。
举个粟子:192.168.0.3/20, 这个IP地址中有一个斜杠,斜杠后面有个数字20。这种地址表示形式就是CIDR。后面24的意思是,32位中前20位是网络号, 后12位是主机号。
伴随着CIDR存在的,还有一个是广播地址、子网掩码以及网络号
1. 广播地址是网络号固定,主机号全为1构成的。如192.168.0.3/20的1广播地址就是192.168.<0000><1111>.<11111111>,即192.168.15.255。如果发送这个地址,所有在192.168.0网络里面的机器都可以收到。
2. 子网掩码是由网络号全为1,主机号全为0构成的。如192.168.0.3/20所在的网络的子网掩码就是11111111.11111111.11110000.00000000,即255.255.240.0。
3. 将子网掩码和IP地址按位计算AND, 就可得到网络号。将192.168.0.3与255.255.240.0按位与即得192.168.0.0,这就是192.168.0.3/20的网络号。
平时我们看到的数据中心里,办公室、家里或学校的IP地址,一般都是私有IP地址段。因为这些地址允许组织内部的IT人员自己管理、自己分配,而且可以重复。因些不同的局域网内可能有相同的私有IP。公有IP地址有个组织统一分配。如果你想要全世界的人都能访问你的网站, 那么你就需要去买一个公有IP。
五类地址中的一类,使用这一类地址,属于某个组的机器都能收到。这有点类似在公司里面大家都加入了一个邮件组。发送邮件,加入这个组的都能收到。
在IP地址的上一行link/ether fa:16:3e:f3:f8:13 brd ff:ff:ff:ff:ff:ff, 这个被称为MAC地址, 是一个网卡的物理地址,用十六进制, 6个byte表示。MAC地址号称全局唯一,不会有两个网卡带着同样的MAC地址,而且网卡自生产出来,就带着这个地址。
一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。而有门牌号属性的IP地址,才是有定位功能的。
MAC地址更像是身份证,是一个唯一的标识。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识。MAC地址也是有一定定位功能的,只不过范围非常有限。局限在一个子网里面。一旦跨越子网,MAC地址就不行了,需要IP地址起作用了。
MAC地址的上一行
,叫作net_device flags, 网络设备的状态标识。
ifconfig 和ip addr的区别:
ifconfig来自net-tools, ip addr来自于iproute2.
net-tools起源于BSD, 自2001年起Linux社区对其停止维护,而iproute2旨在取代net-tools, 并提供了一些新功能。一些Linux发行版已经停止了对net-tools的支持,只支持iproute2.
net-tools通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置,而iproute2则通过netlink套接字接口与内核通讯。
net-tools中的工具的名字比较杂乱,而iproute2则相对整齐和直观,基本是ip命令加后面的子命令。