局域网设备与公网服务之间如何交互数据?

承接上文内核怎么帮程序建立连接的

抓包 tcp -nn -i eth0 port 80 or arp

抓包2类请求包 一个是百度80端口 另一个是arp请求
复制代码

开始listen监听
复制代码

arp -d 192.168.150.2 && curl www.baidu.com

从arp表中删除指定条目 然后请求百度
复制代码

然后看tcpdump监听的内容

这里就是熟悉的三次握手 数据传输 四次分手的过程
需要注意的是在三次握手之前 有2个ARP协议的数据包

请求谁有192.168.150.2的MAC地址请告诉192.168.150.11这个地址
别人就会告诉它这个IP地址在53:2b这个网卡上
复制代码

才开始走三次握手的过程
复制代码

如果不带 -n: tcp -i eth0 port 80 or arp

route不带-n

带上-n 就会裸露这些数值
复制代码

准备2台机器

node1

node2

这两个主机在同一局域网
可以ping通 也不需要路由器
复制代码

node1 ping node2

路由表1

路由表1

在节点2上设置一个新的环回接口: ifconfig lo:22 192.168.168.88/24

如果在node1上ping192.168.168.88 能否ping通?

拿着这地址和掩码(255.255.255.0)做与运算得到192.168.168.0和目的地址192.168.150.0 不一样 跳过第一个条目 匹配第二个条目 然后扔给了路由器192.168.150.2

这就是IPV4互联网下一跳机制
但从网关192.168.150.2跳出去就回不来了

所以如果按照这种方式node1始终ping不通192.168.168.88

所以需要在路由表中添加一个条目
复制代码

route add host 192.168.88.88 gw 192.168.150.12

添加一个主机 经过网关 到 你能ping通的192.168.150.12

这个条目是 只有 192.168.88.88才会走网关
上面图片 路由表1 中第二个条目中是 所有不知道的都会走默认网关
复制代码

注意这个新增的条目对应的掩码地址是 255.255.255.255
当192.168.88.88这个ip和这个掩码做与运算的时候得到的就是它自己 和 前面的目标地址一样 就转发给了192.168.150.12
所以这个时候就通了

同一个局域网才会走网关 不再同一个局域网的不需要走网关 直接走交换机就可以出去

以上就是静态路由的过程
复制代码

再用下上篇文章画的图 串下整个过程

1、用户空间程序http协议(文本)
2、传输控制层 三次握手 传输数据 四次分手的过程
3、数据包怎么出去的主机?网络层的路由选择规则以及下一条机制
4、找到下一跳之后 数据包怎么给到下一跳的 是通过链路层的MAC地址切换的过程
5、客户端这一侧 从上往下完成一个数据包 发出去 服务端完成数据包 回来 客户端再确认 两边开放资源给应用层
6、应用层起线程起进程多路复用NIO即就需要关注IO模型了
7、再之后就需要关注线程池的概念了
复制代码

交换机和路由器区别

交换机在拓扑图中用长方形表示
路由表中x表示
交换机是3层的 有路由表route
交换机可以看到MAC地址
路由器是网络层可以看到IP地址 
所以交换机不能作为2个网络连接使用
2个局域网连接的时候一定是路由表 里面添加一些路由条目
从A网到B网一定会有转发规则
家里的路由器是路由器和交换机合二为一的
家里的路由器上面有4个接口可以接网线 插4台机器
这是走的交换机
交换机里面有一个线插的是路由器
路由器上有2个接口 一个是交换机 一个是IP运营商
交换机是走局域网的
一个局域网至少具备三层 网络层、链路层、物理层
复制代码

猜你喜欢

转载自juejin.im/post/7017267353385697287