关注微信公众号关注更多好文
golang技术分享
1、点击浏览器请求过程
2、IP是怎么来的 DHCP
网络请求过程相同网段和不同网段
-
网络请求首先检查是否是相同网段,如果是相同网段,会发送ARP请求,获取mac地址
-
如果不是同一网段回请求网关,如果没配置网关,根本发不出去
动态主机配置DHCP
动态主机配置协议(Dynamic Host Configuration Protocol),简称 DHCP。
-
请求地址发送0.0.0.0的广播包,目标地址为255.255.255.255,广播包封装了 UDP,UDP 封装了 BOOTP。其实 DHCP 是 BOOTP 的增强版
-
即使有多个DHCP服务器,总会有第一个去响应,给出ip
-
请求的ip收到后,回应DHCP收到,DHCP服务器收到后回应ACK,客户机表示收到,并将信息存储
-
客户机会在过去50%的时候去续租,根据新的回应跟新配置信息
3、物理层
物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。
4、数据链路层
即MAC层,媒体访问控制协议
帧是数据链路层的传送单位
数据链路层主要有两个功能 :帧编码和误差纠正控制。帧编码意味着定义一个包含信息频率、位同步、源地址、目标地址以及其他控制信息的数据包。数据链路层协议又被分为两个子层 :逻辑链路控制(LLC)协议和媒体访问控制(MAC)协议。
5、传输层
传输层包含tcp和udp,也是学习的重点
1⃣️ TCP/IP模型和OSI模型简介
示意图
第一层链接层,也是数据链路层或者MAC层,底层以太网 、wife等原始数据包的发送
第二层网际层,机器MAC转换为IP地址构成巨大互联网交互、网络里找到设备在转化为MAC地址应答
第三层传输层,TCP、UDP等传输协议
第四层应用层,经过下层的封装,层协议较多,http、sftp、smtp、ssh等等
知道了tcp/ip的层级分布,那么我们看一下点击浏览器的过程在此都做了什么
- 当收到一个请求,也就是process_layer2(buffer)的时候查看MAC头是否和自己是一样的,一样说明是发送给自己的
- 然后调用process_layer3(buffer),二层MAC已经被摘除,查看三层的ip头是否和自己的ip是一样的,一样的则是发给自己的,不是则转发出去
- 假设用的tcp协议,process_tcp(buffer),查看tcp头信息,这里有端口号,分发给不同的坚挺端口进行处理
- 进行请求处理
- 然后调用 send_layer3(buffer)。Buffer 里面已经有了 HTTP 的头和内容,以及 TCP 的头。在这个函数里面加一个 IP 的头,记录下源 IP 的地址和目标 IP 的地址。
- 然后调用 send_layer2(buffer)。Buffer 里面已经有了 HTTP 的头和内容、TCP 的头,以及 IP 的头。这个函数里面要加一下 MAC 的头,记录下源 MAC 地址,得到的就是本机器的 MAC 地址和目标的 MAC 地址
- 整理好信息,从网口发出
介绍完TCP/IP的四层模型,我们来看下和iso的osi的七层网络模型
第一层:物理层,TCP/IP 里无对应;
第二层:数据链路层,对应 TCP/IP 的链接层;
第三层:网络层,对应 TCP/IP 的网际层;
第四层:传输层,对应 TCP/IP 的传输层;
第五、六、七层:统一对应到 TCP/IP 的应用层。
2⃣️ 数据链路层
三个主要职责
- 为IP模块发送和接收IP数据报
- 为ARP模块发送ARP和接收ARP应答
- 为RARP发送RARP请求和接收RARP应答
-
IP协议大家都知道位于TCP/IP模型中中的网际层,上层是传输层,下层是链接层
-
ARP叫做地址解析协议,使用IP地址换取MAC地址的一种协议
- 当一个请求发出的时候,请求地址检查目的地址是否在同一网段,不再的话广播请求网关(通常是路由器),网关收到请求,回复收到加上MAC地址,发送到下一个中转或者目的主机
-
RARP叫做逆地址解析协议
-
还有很多其他的协议,以太网,PPP协议(adsl宽带)以及loopback协议
1、IP协议
IP协议是TCP/Ip协议的狠心,所有的TCP、UDP、IGCP的数据都是以Ip数据格式传输的。
IP协议是不可靠的,IP协议没有提供一种数据传达以后的处理机制,这被认为是上层协议TCP或者UDP要做的事
所以TCP事一个可靠的协议,而UDP就没有那么可靠。
IP协议头信息
版本号:IP协议的版本,例如ipv4值为4
头部长度:4位最大长度为0xF,盖子短表示单位事字节(4字节)
服务类型:3位优先权字段+4位TOS字段+1位保留字段,4位TOS字段分别表示最小延时、最大吞吐量、最高可靠性、最小费用,其中最多有一个能置为1。应用程序根据实际需要来设置 TOS值,如ssh和telnet这样的登录程序需要的是最小延时的服务,文件传输ftp需要的是最大吞吐量的服务
总长度:指整个IP数据报的长度,单位字节,即IP数据报的最大长度为65535字节(2的16次方),由于MTU的限制,长度超过MTU的数据报将被分片传输,—最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小
标识:唯一地标识主机发送的每一个数据报,其初始值是随机的,每发送一个数据报其值就加1。同一个数据报的所有分片都具有相同的标识值
标志: 位1保留,位2表禁止分片(DF),若设置了此位,IP模块将不对数据报进行分片,在此情况下若IP数据报超过MTU,IP模块将丢弃数据报并返回一个ICMP差错报文;位3标识更多分片(MF),除了数据报的最后一个分片,其他分片都要把它设置为1
位偏移:分片相对原始IP数据报数据部分的偏移。实际的偏移值为该值左移3位后得到的,所以除了最后一个IP数据报分片外,每个IP分片的数据部分的长度都必须是8的整数倍
生存时间::数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置,常设置为64。数据报在转发过程中每经过一个路由该值就被路由器减1.当TTL值为0时,路由器就将该数据包丢弃,并向源端发送一个ICMP差错报文。TTL可以防止数据报陷入路由循环
协议: 区分IP协议上的上层协议。在Linux系统的/etc/protocols文件中定义了所有上层协议对应的协议字段,ICMP为1,TCP为6,UDP为17
头部校验和: 由发送端填充接收端对其使用CRC算法校验,检查IP数据报头部在传输过程中是否损坏
源IP地址和目的IP地址: 表示数据报的发送端和接收端。一般情况下这两个地址在整个数据报传递过程中保持不变,不论中间经过多少个路由器
选项:可变长的可选信息,最多包含40字节。选项字段很少被使用。可用的IP可选项有:
a. 记录路由: 记录数据包途径的所有路由的IP,这样可以追踪数据包的传递路径
b. 时间戳: 记录每个路由器数据报被转发的时间或者时间与IP地址对,这样就可以测量途径路由之间数据报的传输的时间
c. 松散路由选择: 指定路由器的IP地址列表数据发送过程中必须经过所有的路由器
d. 严格路由选择: 数据包只能经过被指定的IP地址列表的路由器
e. 上层协议(如TCP/UDP)的头部信息
TTL 8bit :生存时间,数据报到达目的地之前经过的路由数,每经过一次路由就将该值减1,当TTL位0的时候,路由器就会将该数据报丢弃,8bit最大255,常设置为64
IP路由选择
最特殊的情况是主机对主机直连,那么主机根本不需要寻找路由,直接传递数据就好,依靠ARP协议广播就可以
主机经过若干个路由器和目的主机连接,那么路由器就要通过ip包的信息来为ip寻找下一个合适的目标来进行传递,如果数据包的TTL到期就丢弃
搜索路由表,优先搜索匹配主机,如果能找到和IP地址完全一致的目标主机,则将该包发向目标主机
搜索路由表,如果匹配主机失败,则匹配同子网的路由器,这需要“子网掩码(1.3.)”的协助。如果找到路由器,则将该包发向路由器。
搜索路由表,如果匹配同子网路由器失败,则匹配同网号路由器,如果找到路由器,则将该包发向路由器。
搜索路由表,如果以上都失败了,就搜索默认路由,如果默认路由存在,则发包
如果都失败了,就丢掉这个包。
这再一次证明了,ip包是不可靠的。因为它不保证送达。
ARP协议
- ARP协议是一种解析协议,本来主机是完全不知道这个IP在哪个主机的哪个接口
- 当主机要发一个ip包的时候,会首先查一下自己的ARP高速缓存(ip-MAC地址缓存对应表)
- 如果查询的IP-MAC值对不存在,那么主机就像网络发送一个ARP广播协议包,这个包里面包含要查询的ip地址
- 收到广播包的主机都查询自己的ip地址,如果发现和自己一样,那么就准备一个包含自己MAC地址的ARP包传送给ARP广播的主机
- 而广播主机收到后,就放入缓存ARP的缓存中,发送官博的主机就会用心的ARP缓存数据发送数据包
任何系统
arp -a
? (169.254.0.32) at 0:f4:8d:a0:9:db on en0 [ethernet]
? (169.254.0.171) at 5c:80:b6:45:a2:63 on en0 [ethernet]
? (169.254.8.69) at 0:f4:8d:db:36:81 on en0 [ethernet]
? (169.254.9.124) at 9a:e7:bf:d:d4:a6 on en0 [ethernet]
? (169.254.10.1) at 72:d7:e6:bb:87:90 on en0 [ethernet]
? (169.254.11.88) at 50:e0:85:50:e0:d3 on en0 [ethernet]
? (169.254.14.160) at a0:c5:89:a3:fb:56 on en0 [ethernet]
? (169.254.17.14) at 2:c6:7e:4a:d2:36 on en0 [ethernet]
? (169.254.17.242) at 14:20:5e:10:b5:3c on en0 [ethernet]
ARP的高速缓存时间是20分钟
2、ICMP协议
百度百科的解释
ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。 这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用 font>
ICMP使用IP的基本支持,就像它是一个更高级别的协议,但是,ICMP实际上是IP的一个组成部分,必须由每个IP模块实现。
IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。
ICMP协议大致分为两类,一种是查询报文,一种是差错报文。其中查询报文有以下几种用途:
-
ping查询
-
子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码)
-
时间戳查询(可以用来同步时间)
-
ICMP的应用–Traceroute
IP选路
IP选路,即IP寻路,就是根据路由表中的记录,来决定当前数据报是直接交付(目的地址属于当前局域网)还是发往下一跳路由(隶属于不同的局域网)。
静态路由选路
查看路由表
netstat -rn
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 172.16.63.254 UGSc 114 8 en0
10.8/16 10.9.0.1 UGSc 0 0 utun1
10.9/24 10.9.0.104 UGSc 107 0 utun1
10.9/16 10.9.0.1 UGSc 0 0 utun1
10.9.0.104 10.9.0.104 UH 1 0 utun1
10.29.114.134/32 10.9.0.1 UGSc 0 0 utun1
10.47.67.196/32 10.9.0.1 UGSc 0 0 utun1
10.111/16 10.9.0.1 UGSc 0 0 utun1
10.111.179.243/32 10.9.0.1 UGSc 0 0 utun1
10.168.100.103/32 10.9.0.1 UGSc 0 0 utun1
47.52.55.213/32 10.9.0.1 UGSc 0 0 utun1
47.75.96.181/32 10.9.0.1 UGSc 0 0 utun1
47.75.168.58/32 10.9.0.1 UGSc 0 0 utun1
47.91.193.192/32 10.9.0.1 UGSc 0 0 utun1
47.91.223.112/32 10.9.0.1 UGSc 0 0 utun1
47.93.84.213/32 10.9.0.1 UGSc 0 0 utun1
47.96.1.126/32 10.9.0.1 UGSc 0 0 utun1
Flags 解析
U 表明该路由可用
G表明该路由是到一个网关。如果没有这个标志,说明和Destination是直连的,而相应的Gateway应该直接给出Destination的地址。
H表明该路由是到一个主机,如果没有该标志,说明Destination是一个网络,换句话说Destination就应该写成一个网络号和子网号的组合,而不包括主机号(主机号码处为0),例如 10.9.0.104
D表明该路由是为重定向报文创建的
M该路由已经被重定向报文修改
这样,IP选路的方式就可以更加具体化了。如下
-
首先用IP地址来匹配那些带H标志的DestinationIP地址。
-
如果1失败就匹配那些网络地址。
-
如果2失败就发送到Default网关