计算机网络总结

计算机组成与系统结构,数据结构与算法,计算机网络,操作系统,编译原理都是计算机基础课程。简单总结下计算机通讯网络的各种基础概念,与通讯过程。通讯双方使用的通讯协议

TCP/IP五层模型

TCP/IP五层模型

只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层,没下层。至于为什么要分层,程序复杂了就要分层一个概念,降低开发成本,把各个成之间扮演的角色分离出来。

数据传输过程:

1
2
3
4
5
6
源主机                 路由器           交换机            目标主机
应用层 应用层
(TCP头)传输层 传输层
(IP头)网络层 网络层 网络层
(链路头)数据链路层 数据链路层 数据链路层 数据链路层
物理层 物理层 物理层 物理层

助记:传输层(Transmission) 网络层(Internet)

IP与MAC

IP是地址,有定位功能。MAC是身份证,无定位功能

内网IP范围

10.0.0.0-10.255.255.255
172.16.0.0-172.31.255.255
192.168.0.0-192.168.255.255
上面这三个地址范围都是私有地址,只能在内部局域网使用的.在公网是不能使用的

DHCP协议

DHCP协议用来给用户分配IP地址。PXE能够按照操作系统

自己组网

  • ARP是通过吼的方式寻找目标MAC,之后记住一段时间,做缓存
  • 交换机是有MAC地址学习能力的,学完就知道在哪了,不用广播了

VLAN

  • 交换机数目太多,会遇到环路问题,STP协议解决环路问题
  • 可以通过VLAN形成虚拟局域网,解决广播与安全问题

ICMP ping

  • ping 查询报文,Traceroute使用差错报文
  • ping 127.0.0.1 是不经过网卡的,通过环路来处理
  • 以太网驱动程序中可以获取本地主机的IP地址,可以ping本地IP的方法来判断网卡是否正常工作

网关

  • 离开本地局域网需要经过网关,网关是路由器的一个网口
  • 路由器是三层设备,里面有如何寻找下一跳的规则
  • 经过路由器之后 MAC 头要变,如果 IP 不变,相当于不换护照的欧洲旅游,如果 IP 变,相当于换护照的玄奘西行。

路由

  • 把数据包按照路由表转发到指定的端口
  • 不同网段之间通信就需要路由或者三层交换机,同一网段之间通信使用二层交换机就够
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # windows版命令
    route print # 查看路由信息
    route add 150.0.0.0 mask 255.0.0.0 192.168.38.1 # 指定外网150网段走192.168.38.1网关(下一个跃点地址)
    route add 150.0.0.0 mask 255.0.0.0 192.168.38.1 if 0x3 # 指定外网150网段走192.168.38.1网关(下一个跃点地址) 接口为3
    route add 192.168.33.0 mask 255.255.255.0 192.168.38.1 # 192.168.33网段走192.168.38.1网关(下一个跃点地址为)
    route add 0.0.0.0 mask 0.0.0.0 192.168.38.1 #所有地址都走192.168.38.1网关(下一个跃点地址为)

    route delete 192.168.33.0 # 删除路由
    tracert www.infotech.vip # 查看经过路由

    # linux命令
    ip route add 150.0.0.0/24 via 192.168.38.1 dev eth0 # 150.0.0.0的数据包走192.168.38.1,从本机eth0出口发出

其他: 一个网卡多网段ip地址,LAN1和LAN2通过交换机物理相连,如果要实现通信有两个方法:1.通过路由器连接LAN1和LAN2,通过路由器进行路由。2.两个网段的电脑把两个网段的IP都加上

路由协议

  • 静态路由、动态路由静态路由可以配置复杂的策略路由,控制转发策略
  • 动态路由:BGP协议、OSPF协议

UDP

  • TCP 复杂,UDP 简单,TCP维护连接
  • UDP 虽然简单,但它有简单的用法。它可以用在环境简单、需要 多播、应用层自己控制传输的地方。例如 DHCP、VXLAN、QUIC(Quick UDP Internet Connections ,快速 UDP 互联网连接)等

TCP

  • 三层握手,四次挥手
  • TCP包头复杂,关注五个问题:顺序问题,丢包问题,连接维护,流量控制,拥塞控制
  • 顺序问题、丢包问题、流量控制都是通过滑动窗口来解决
  • 拥塞控制是通过拥塞窗口来解决,相当于往管道里面倒水,快了容易溢出,慢了浪费带宽,要摸着石头过河,找到最优值

STCP

STCP(Scalable TCP)是TCP拥塞控制协议的一种。STCP算法是由 Tom Kelly于 2003年提出的 ,通过修改 TCP的窗口增加和减少参数来调整发送窗口大小 ,以适应高速网络的环境。CTP与TCP的最大不同之处在于它是多宿主(Multi-homing)连接,而TCP是单地址连接。

UNIX网络中TCP、 UDP、 STCP这三者点端口是独立的,也就是说三个协议可以同时绑定同一个端口,例如三者都同时绑定了1024,当接受到data时,三者是各接受各自的并不会冲突。为了好理解,原则上把已知的服务的TCP、 UDP、 STCP分配同一个端口。例如80端口在TCP UDP STCP都分给WEB服务,虽然目前WEB大多是用TCP。为什么可以共用同一端口呢?IP协议头信息中的协议标识不同区分出TCP和UDP,然后TCP、UDP首部的端口号进行提供各个应用程序分用,所以使用TCP/UDP 协议的上层应用程序可以分配重复的端口号。详细参考《TCP/IP详解》-以太网数据帧的分用过程。

当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以确定接收数据的上层协议。这个过程称作分用(Demultiplexing),下图1-8显示了该过程是如何发生的。

TCP/IP以太网数据帧

NAT

NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”。NAT 功能通常被集成到路由器、防火墙、ISDN路由器或者单独的NAT设备中。

socket

  • select、poll、epoll、iocp
  • MTU: Maxitum Transmission Unit 最大传输单元
  • MSS: Maxitum Segment Size 最大分段大小

MTU= MSS+TCP层头部长度+IP层头部长度 (MSS是指应用层在一个数据包内最大能传输的字节数,MTU是指IP层在一个数据包内最大能传输的字节数)
举个例子:如果你要搬家,需要把东西打包,用车运走。这样的情况下,车的大小受路的宽度限制;箱子的大小受车限制;能够搬运的东西的大小受箱子的限制。这时可以将路的宽度理解成第二层的MTU,车的大小理解成第三层的MTU,箱子的大小理解成第四层的MTU,搬运的东西理解成MSS

我们可以把MSS设置成1300,解决大部分环境问题,TCP建立连接握手的时候会协商各自支持的最大包大小

http

  • GET、POST、PUT、DELETE
  • http头
  • HTTP2.0 头压缩、分帧、二进制编码、多路复用提升性能
  • QUIC 通过UDP自定义TCP,提升性能

HTTP包结构

HTTP完整包结构

http与websocket共用端口

WebSocket 是以类似Socket 的TCP 长连接通讯模式,是全双工方式, 和HTTP一样都是基于TCP协议.
http协议只是做WebSocket的握手,真正通信还是ws(即tcp协议)。

客户端开始建立 WebSocket 连接时要发送一个 header 标记了 Upgrade 的 HTTP 请求,表示请求协议升级。

1
2
3
4
5
6
7
8
GET /websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xq234112kg==
Sec-WebSocket-Protocol: chat, superchat
Origin: http://localhost:8080
Sec-WebSocket-Version: 13

服务器告诉客户端即将升级的是Websocket协议

1
2
3
4
5
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 3VW54634SDFWRVERV==
Sec-WebSocket-Protocol: chat

然后数据走的就是ws协议了,只需要经过一次HTTP请求,然后就可以做到源源不断的信息传送了

ws帧结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+

应用:
可以所有操作通过ws,也可以ws用来实现消息推送功能,增删改通过ws实现。

https

  • 对称加密(效率高)、非对称加密
  • CA证书
  • HTTPS 是综合了对称加密和非对称加密算法的 HTTP 协议。既保证传输安全,也保证传输效率。

视频流

  • 通过空间、时间各种算法压缩
  • 压缩好的数据,为了传输组成一系列 NALU,按照帧和片一次排序
  • 排列好的 NALU,在网络传输的时候,要按照 RTMP 包的的格式进行包装,RTMP 的包会拆分成 Chunk 进行传输

P2P

下载一个文件可以使用 HTTP 或 FTP,这两种都是集中下载的方式,而 P2P 则换了一种思路,采取非中心化下载的方式

DNS

DNS 是网络世界的地址簿,可以通过域名查地址

CDN

CDN 和电商系统的分布式仓储系统一样,分为中心节点、区域节点、边缘节点,而数据缓存在离用户最近的位置

VPN

  • VPN 可以将一个机构的多个数据中心通过隧道的方式连接起来
  • IPsec VPN 可以保证私密性、完整性、真实性、简单便宜,但是性能稍微差一些
  • MPLS-VPN 综合和 IP 转发模式和 ATM 的标签转发模式的优势

VPN包结构:

VPN包结构

移动通讯

  • 4G 网络的结构,有 eNodeB、MME、SGW、PGW 等

虚拟化

  • 虚拟网卡通过TUN/TAP字符设备方式,将虚拟机内外连接
  • 云网络重点关注:共享,隔离,互通,灵活。共享互通通常的方式:桥接和NAT。隔离通过VLAN方式

软件定义网络

  • OpenvSwitch 开源虚拟交换机

云安全

  • 通过配置iptables

云隔离

  • 解决 VLAN 数目有限的问题,需要通过 Overlay 的 方式,常用的有 GRE 和 VXLAN
  • GRE 是一种点对点的隧道模式

容器隔离

主要通过 namespace 和 cgroup 技术进行资源隔离

Flannel,Calico

Flannel 是跨节点容器网络方案之一,它提供的 Overlay 方案主要有两种方式,一种是 UDP在用户态封装,一种是 VXLAN 在内核态封装,而 VXLAN 的性能更好一些

RPC

  • 服务发现
  • Stub程序

XML SOAP

  • 原来的二进制 RPC 有很多缺点,格式要求严格,修改过于复杂 ,不面向对象,于是产生了基于文本的调用方式——基于 XML的 SOAP
  • SOAP 有三大要素:协议约定用 WSDL、传输协议用 HTTP、服务发现用 UDDI

JSON RESTful

  • SOAP 过于复杂
  • RESTful不仅仅是一个API,而是一种架构模式,主要面向资源,提供无状态服务,利于横向扩展应对高并发

二进制RPC

  • dubbo使用的是Hessian2
  • spring cloud 使用的是RESTful API
  • 二进制的RPC性能更高

夸语言RPC

  • GRPC 是一种二进制,性能好,跨语言,还灵活。不足要写协议文件
  • GRPC 序列化使用 Protocol Buffers,网络,网络传输使用 HTTP 2.0,服务治理可以使用基于 Envoy 的 Service Mesh

搭建实验环境

  • virtual box
  • Open vSwitch
  • Centos 虚拟机

抓包工具使用

  1. 监听特定网卡
    tcpdump -i eth0
  2. 特定端口
    tcpdump port 8080
  3. 监听特定主机之间的通信
    tcpdump ip host 127.0.0.1 and 127.0.0.2

tcpdump tcp -i eth0 -t -s 0 and dst port 8080 and src net 120.36.3.0/24 -w ./target.cap

(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
(2)-i eth0 : 只抓经过接口eth0的包
(3)-t : 不显示时间戳
(4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
(5)-c 1000 : 只抓取1000个数据包
(6)src port 8080 : 源端口是22的数据包,dst port - 2222 不抓取目标端口2222的包
(7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析,去掉这句就会打印在屏幕

问题汇总

生产环境遇到问题:外网情况,客户网络访问本地http路径,本地做了http跳转到https 302。 部分客户环境可以正常范围,部分客户环境返回的302带的新路径ip地址被替换增加了一段新ip地址,可能是网关,或者反火墙做了302的限制

  1. 在客户端抓包发现http获取下载文件的路径被替换
  2. 在客户那边使用下面正确的不进行跳转的路径进行测试
    curl –insecure -v -o ff.tar.gz https://121.3.3.3:443/data/upload/version/ff.tar.gz
  3. 在服务端也进行抓包查看服务端返回的包是否正常
  4. 解决方法就是不使用302跳转,直接使用最终地址

想要程序监听多个端口方法?

  1. 可以使用Linux端口转发功能NAT,可以转发到不同服务器的不同端口(本机也是可以的,Nginx可以转发http请求)。

    1
    2
    3
    4
    5
    vi /etc/sysctl.conf开启允许端口转发。net.ipv4.ip_forward =1(CentOS7则是在 /usr/lib/sysctl.d/50-default.conf额外添加)
    iptables -t nat -A PREROUTING -p tcp --dport 8039 -j REDIRECT --to-ports 8090 (端口转发)
    vim /etc/sysconfig/iptables (查看配置信息)
    service iptables save
    service iptables restart

    其他命令

    1
    2
    iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.2 --sport 8090 -j SNAT --to-source 192.168.1.3:7070 (转发接收)
    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8111 -j DNAT --to 192.168.1.3:8090(访问本机eth0 8111 端口的请求转发到 192.168.1.3 的 8090端口)

    删除规则用-D

新技术

DPDK

网络设备(路由器、交换机、媒体网关、SBC、PS网关等)需要在瞬间进行大量的报文收发,因此在传统的网络设备上,往往能够看到专门的NP(Network Process)处理器,有的用FPGA,有的用ASIC。这些专用器件通过内置的硬件电路(或通过编程形成的硬件电路)高效转发报文,只有需要对报文进行深度处理的时候才需要CPU干涉。但在公有云、NFV等应用场景下,由于包处理任务存在内核态与用户态的切换,以及多次的内存拷贝,系统消耗变大,以CPU为核心的系统存在很大的处理瓶颈。为了提升在通用服务器(COTS)的数据包处理效能,Intel推出了服务于IA(Intel Architecture)系统的DPDK技术。DPDK是Data Plane Development Kit的缩写。简单说,DPDK应用程序运行在操作系统的User Space,利用自身提供的数据面库进行收发包处理,绕过了Linux内核态协议栈,以提升报文处理效率。DPDK是一组lib库和工具包的集合。

用户态模式的PMD驱动,去除中断,避免内核态和用户态内存拷贝,减少系统开销,从而提升I/O吞吐能力

参考