计算机网络笔记

244 阅读10分钟
  • 日志里有uri,ip,来源(渠道)。分析渠道(下一波广告投哪里)。中国在向服务行业转型,大家都玩数据,卖服务。
  • 钱花在营销上。
  • 所有的公司都有高并发的问题,如何实现高并发(lvs)?
  • 先学计算机网络吧。(非科班o(╥﹏╥)o)

什么是网络

  • 计算机软件工程学,分层思想。OSI7层参考模型。但是学TCP/IP精简过后的5层(链路层和物理层拆开)。
应用层(http等)->传输控制层(tcp/udp)->网络层(路由表下一跳)->链路层(mac地址)->物理层

应用层http(用户态)

  • cd /proc/?/fd ?代表当前bash的进程号。 fd是文件描述符

  • 0 输入 1 输出 2错误输出

  • exec 8<> /dev/tcp/www.baidu.com/80Linux万物皆文件。 建立了一个socket(内核态从传输层开始向下) 和百度握手

  • 第一步建立连接,第二步发送数据

  • 协议就是约束,规定。

echo -e 'GET / HTTP/1.0\n' >& 8   这里面其实就是http协议。就是规约。后面的\n必须有
&代表后面的8不是文件而是文件描述符
把这句话通过socket发出去
-e 是能识别里面的转义即 换行符
============================================
cat 0 <& 8  从socket中读出东西 。能拿到百度的信息。

应用层是用户态,从传输控制层开始往下是内核态。

传输控制层(开始内核态,和应用无关)里面有端口

  • TCP 面向连接(不是物理的,指的三次握手)的可靠的。UPD 不是面向连接,不可靠
  • 面向连接:确认过眼神。
  • 三次握手、四次挥手
三次握手
============================================
C男人 S女人
男的看见了个女(没看见脸)。 第一次握手
女的也看了男的一眼。 第二次握手
这时候男的看见女的的脸了,如果不看她了说明不好看,就不继续看了(不建立连接),否则说明好看 建立连接。 第三次握手
============================================
在IO的角度来说,双方都需要确认input 和output 都正常
C 发消息给 S,S接受到了(说明S的接受功能正常)  第一次握手
S 回送消息个C, C接受到了(说明C的接受功能正常,并且发送功能也正常) 第二次握手
这时候S 并不知道自己发送功能正不正常。
所以C 接着发消息给 S  (S 确认自己的发送功能正常) 第三次握手
三次握手完成后才开始开辟线程。。
============================================
============================================
四次挥手
============================================
为什么要进行挥手。操作系统能开65535个端口。客户端会随机选一个端口进行连接。不够用
为什么是4次?
男人 女人
男给女说 要离婚  第一次
女给男说 知道了  第二次
女给男说 我也要离婚  第三次
男给女说 知道了  第四次
双方必须都同意。而且每个消息对方都会回送一次。
  • 三次握手->数据传输->四次挥手 称为一个最小粒度 不可被分隔。
  • 三次握手 必须都是和同一个对象。
  • nestat -natp 一个socket就是 ip:port
[root@node1 fd]# netstat -anpt | grep sshd
# 最上面的这个listen 是一个父进程, 负责监听22端口。
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1017/sshd           
# 有三个说明开了三个xshell
tcp        0      0 192.168.48.11:22            192.168.48.1:9244           ESTABLISHED 7038/sshd           
tcp        0     64 192.168.48.11:22            192.168.48.1:8973           ESTABLISHED 2874/sshd           
tcp        0      0 192.168.48.11:22            192.168.48.1:6555           ESTABLISHED 1223/sshd           
tcp        0      0 :::22                       :::*                        LISTEN      1017/sshd

传输控制层的三次握手需要发送的包其实不是这一层发的。这一层只准备这些包。发送由下面的层。

service mesh 号称下一代微服务标准。 学网络干啥都是必须的。

网络层,探路者(梳理网络,下一跳)

cat /etc/sysconfig/network-scripts/ifcfg-eth0
if interface
cfg config
eth 以太网 0 第一块网卡
  • IP 是点分字节
  • 掩码。拿着目标IP和掩码 会进行按位与(非常快)。可以得出机器所在网络的网络号
route -n 路由表
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.48.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.48.2    0.0.0.0         UG    0      0        0 eth0

例如ping baidu
PING baidu.com (220.181.38.148) 56(84) bytes of data.  
会用目标IP 220.181.38.148 和路由表里的掩码进行按位与。然后和第一列Destination匹配。
第三条匹配到了,且 gateway 192.168.48.2  这个就是下一跳的地址
第三条肯定能匹配上  叫默认网关!
网关列 中的0.0.0.0 代表是目标IP和本机的IP在一个网络内,不需要走路由。

网络层就负责找到下一跳,后面怎么发是链路层干的事儿

链路层

  • 链路层通讯的地址 mac地址 arp表

DNS解析 IP和域名的映射。 ARP解析 IP地址和网卡硬件地址的映射

  • 链路层封一个包(arp)。里面主要有三个内容
    • 最外层:源目的mac地址
    • 次外层:源目的IP
    • 里层:源目的端口号(传输层来的)
TCP/IP协议是基于下一跳的机制。
ip是端点间。
mac地址是节点间。
如何知道网关的mac地址呢
  • 一台机器开机后,不知道局域网里都有谁,会封一个arp包。包里的目标mac地址是FF:FF:FF:FF:FF:FF,目标IP是网关的IP。这个包发到交换机的时候,交换机看到包里的目标mac是全F,会将这个包进行广播。其他机器收到这个包,看到包里的目标IP不是自己,会把这个包丢弃。网关收到后,看到目标IP是自己,会返回一个arp包,这样我的机器就知道网关的mac地址了。
  • 交换机(二层)有学习能力。能学到mac地址 对应哪个端口。

每台机器联网,交换机 会知道所有机器的mac地址。

  • 源目mac地址每经过一次下一跳都要进行替换。源目IP地址不变换。

实验

node1 ip 192.168.48.11   
node2 ip 192.168.48.12
给node2 添加了一块虚拟网卡 ip为 6.6.6.6

node1 如何 ping通 node2?
修改node1的路由表。让访问6.6.6.6时的下一跳指向192.168.48.12

lvs负载均衡

  • 不是反向代理,代理必须手得握上。

为什么tomcat并发连接数少。因为tomcat是七层的。所以慢。中间还得三次握手等等。tomcat是java程序更慢了。用户态内核态切换。

  • 路由器带着一家人上网。非常快。
  • 负载均衡器 到网络层 偷窥传输层,偷窥端口号
  • NGINX是7层的 并发数是有上限的(官方5W个)。
  • 由于负载均衡器没到应用层,所以不知道应用层是什么协议。需要后面的服务器都是镜像的

最前端LVS(hold流量)->nginx(hold住握手)分流->tomcat(计算)

NAT模式

  • 路由器 NAT,私有IP转公网IP

  • 通信是非对称的。下载快上传慢

  • 为了response包还能回去,Rserver的默认网关需要配置成负载均衡服务器。

  • 请求和响应都走负载均衡器,压力大,算力和 非对称的原因。

引出另一种模式

DR(直接路由模型)

DR模式

  • 后端两个server中都隐藏一个VIP(对外隐藏,对内可见)。和负载均衡服务器上的VIP是一个东西。请求和响应走一个环形。
  • CIP->VIP这个包到了负载均衡服务器这如果没有NAT,这个包就在这停住了,因为本身自己就是VIP,目的IP也是VIP
  • 不止网络层能干事情,还有链路层。动二层不动三层。欺骗MAC。
  • 负载均衡器给RIP的server发包。把最外层mac欺骗成了rip的mac。这个包里面目标地址是VIP。而且RIP的机器上隐藏了一个VIP。所以能接受到。
  • 负载均衡服务器和Rserver需要在同一局域网。

隧道模式

隧道模式

  • 隧道TUN。对比翻墙。一个包里包含了一个真的信息的包。IP的数据报背着IP的数据包。

lvs

Linux virtual server 1998年5月国人章文嵩

隐藏VIP的方法

/proc/sys/net/ipv4/conf/eth0    修改两个内核参数
arp_ignore:收到arp请求的响应级别
arp_announce:将自己mac地址向外的通告级别
就是让Rserver 不要暴露自己身上的VIP。只有自己知道
  • LO网卡是一个虚拟的网卡。这个网卡的特点就是外界连不到他身上。在它身上开一个子网卡。为VIP

调度方法

  • 看谁身上的连接数少就给谁。那么如何知道连接数是多少的呢。偷窥!三次握手他能偷窥到两次。分手也能偷窥到。
  • 加权最少连接
  • 轮询rr
  • ……

ipvs

  • lvs已经成了Linux内核的一个模块。跟他打交道需要用ipvs
  • vmware出了提供了虚拟主机。还提供了虚拟网络
  • node1:ifconfig eth0:8 192.168.48.100/24 VIP
  • node2,node3作为RServer。需要先调协议,隐藏VIP。
    • 修改内核
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

# 这一定掩码要全是255 如果是255.255.255.0 会产生192.168.48.0的网络号。脑补。
ifconfig lo:8 192.168.48.100 netmask 255.255.255.255
  • node2,node3 上 yum install httpd
  • echo 'from nodeX' /var/www/html/index.html创建主页。访问浏览器就应该有效果。
  • yum install ipvsadm -y在node1上安装ipvsadm
  • ipvsadm -A -t 192.168.48.100:80 -s rr入口规则:接受80端口的tcp。调度方式rr
  • ipvsadm -a -t 192.168.48.100:80 -r 192.168.48.11 -g -w 1配置realserver
  • 在node1上netstat -anltp看不到连接的建立。说明没有握手
  • ipvsadm -lnclvs的偷窥记录表。

FIN_WAIT,说明是正常的。SYN_RECV,说明握手没有建立,只发送了第一个sync等待接受对面的包。有问题。排障

keepalived

如果lvs挂了。那么业务就下线了 单点故障。

  • realserver也会挂。但是lvs中还有记录,部分业务不正常。
  • 单点故障的解决办法就是一变多。
    • 主备,主机上有VIP 备机没有。
    • 主主,用的不多。
  • 主备,皇帝和皇子们。
    • 备机定时监控主机挂没挂。对主有压力。皇子实时监控皇帝
    • 主周期的向所有备机发广播包。皇子发现皇帝三天没上朝就揭竿而起。
    • 所有备机,亮出权重。推让制。
  • 主从 互相协作。和主备不一样。
  • 如何判断realserver挂了。 换言之如何知道百度挂了
ping不通。这不能判断应用层是不是坏了。网络有7层。应该验证应用层的http协议。看返回值。
  • 主机和备机都要安装keepalived
    • 监控自己身上的lvs服务。
    • 互相通信。master广播。backup准备选举。
    • 帮忙配置ipvsadm等配置。(keepalived有配置文件)
    • 对realserver做健康检查
  • keepalived是一个通用的服务。来实现HA
  • nginx也可以用keepalived
  • 不要为了技术而技术,主机很贵 备机便宜。坏了赶紧修主 再换回去。
  • 不是所有的主备,主好了都能抢回来。LVS-HA可以抢回去,备自动降级。
  • keepalived是有问题的,进程异常退出。主备身上VIP都在了

搭建

  • 清除之前node1上LVS的配置 ipvsadm -C清除配置。
  • yum install keepalived ipvsadm -ynode1,node4
  • 配置文件vim /etc/keepalived/keeplived.conf
vrrp_instance VI_1 {
    state MASTER   // 备机改成BACKUP
    interface eth0
    virtual_router_id 51
    priority 100   // 备机优先级改成50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.48.100/24 dev eth0 label eth0:8 // VIP
    }
}

// 类似ipvsadm -A -t xxx -s rr
virtual_server 192.168.48.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR //DR模式
    nat_mask 255.255.255.0
    // 如果不是0,lvs会让一个用户 在一段时间 一直和一个realserver通信。
    persistence_timeout 0
    protocol TCP
    // 出口 ipvsadm -a -t xxx -r xxx -g -w 1  realserver
    real_server 192.168.48.13 80 {
        weight 1
        // 确定realserver服务是好的。
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.48.12 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
  • 当master挂了,备机会顶上。客户无感知
  • 当master复活,会抢回来。
  • 当一个realserver挂了。ipvsadm -ln会去自动掉这个记录。
  • 当一个realserver复活,ipvsadm -ln会自动添加这个记录。