计算机组成与系统结构,数据结构与算法,计算机网络,操作系统,编译原理都是计算机基础课程。简单总结下计算机通讯网络的各种基础概念,与通讯过程。通讯双方使用的通讯协议
TCP/IP五层模型
只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层,没下层。至于为什么要分层,程序复杂了就要分层一个概念,降低开发成本,把各个成之间扮演的角色分离出来。
数据传输过程:
1 | 源主机 路由器 交换机 目标主机 |
助记:传输层(Transmission) 网络层(Internet)
链路层
- Ethernet 以太网协议,规定了一组电信号构成一个数据包,叫做”帧”(Frame)。每一帧分成两个部分:标头(Head)和数据(Data),IEEE802.3
- ARP协议 Address Resolution Protocol,地址解析协议,IP转MAC
- BARP Rebellion Address Resolution Protocol 逆向地址解析协议,MAC转IP
- VLAN Virtual Local Area Network,虚拟局域网
- STP Spanning Tree Protocol 生成树协议
- PPP Point-to-Point Protocol 点对点协议
- CSMA/CD Carrier-Sense Multiple Access With Collision Detection 载波监听多点接入/碰撞检测
“链接层”的功能,它在”物理层”的上方,确定了0和1的分组方式
扩展:
TD-LTE系统由3部分组成:核心网(EPC,Evolved Packet Core),接入网(eNodeB),用户设备(UE)
根据接口所处的位置分为空中接口和地面接口
4G网络无线制式的接口协议分为三层:物理层(PHY),L2数据链路层(PDCP:分组数据汇聚协议层,RLC:无线链路控制层,MAC:媒体接入层),L3网络层(NAS:非接入层协议,RRC:无线资源控制层)
IP与MAC
IP是地址,有定位功能。MAC是身份证,无定位功能。链路层以太网协议Ethernet MAC,网络层IP,传输层增加了端口。
内网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 变,相当于换护照的玄奘西行。
路由
- 把数据包按照路由表转发到指定的端口
- 不同网段之间通信就需要路由或者三层交换机,同一网段之间通信使用二层交换机就够其他: 一个网卡多网段ip地址,LAN1和LAN2通过交换机物理相连,如果要实现通信有两个方法:1.通过路由器连接LAN1和LAN2,通过路由器进行路由。2.两个网段的电脑把两个网段的IP都加上
1
2
3
4
5
6
7
8
9
10
11
12windows版命令
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数据包经由路由转发的时候源ip,目的ip是否改变?
答案是不能改变的,除非做了NAT转换才能改变。mac地址是变化的,因为发送端开始不知道目的主机的mac地址,所以每经过一个路由器目的mac地址是变化的。有NAT就将改变源地址的IP(原源地址的Ip地址改为了路由器的IP地址)
源NAT(平时叫的NAT)SNAT:私网到公网的转换。应用于局域网上网使用,有多个公网ip的情况下。改变源IP
目的NAT(平时叫的端口映射)DNAT:公网到私网的转换。应用于局域网架设对外服务(web服务)场景,一个公网ip可以提供N个(端口号)服务。改变目的IP
NAPT技术:是为了解决数据报文返回到源端,引入端口号机制,避免同一个公网地址,引起冲突,引入的机制
路由协议
- 静态路由、动态路由静态路由可以配置复杂的策略路由,控制转发策略
- 动态路由: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显示了该过程是如何发生的。
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与websocket共用端口
WebSocket 是以类似Socket 的TCP 长连接通讯模式,是全双工方式, 和HTTP一样都是基于TCP协议.
http协议只是做WebSocket的握手,真正通信还是ws(即tcp协议)。
客户端开始建立 WebSocket 连接时要发送一个 header 标记了 Upgrade 的 HTTP 请求,表示请求协议升级。
1 | GET /websocket/ HTTP/1.1 |
服务器告诉客户端即将升级的是Websocket协议
1 | HTTP/1.1 101 Switching Protocols |
然后数据走的就是ws协议了,只需要经过一次HTTP请求,然后就可以做到源源不断的信息传送了
ws帧结构:
1 | 0 1 2 3 |
应用:
可以所有操作通过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包结构:
移动通讯
- 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 虚拟机
抓包工具使用
- 监听特定网卡
tcpdump -i eth0 - 特定端口
tcpdump port 8080 - 监听特定主机之间的通信
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)分析,去掉这句就会打印在屏幕
安全
IPsec
Ipsec顾名思义就是ip security,ip安全,主要应用于ip包传输的安全,也就是网络层的安全传输
IPsec IP协议进行安全加强的迫切需要催生了IPsec,IPsec在网络层将IP报文进行处理之后再传输,增强了IP报文的安全性。准确来说,IPsec不是一个单独的协议,而是一组协议。
IPsec包括传输模式(Transport Mode)和隧道模式(Tunnel Mode)两种模式。
IPsec包含了三个最重要的协议:认证头AH(Authentication Header),封装安全载荷ESP(Encapsulating Security Payload),密钥交换协议IKE(Internet Key Exchange)
SSL
SSL(Secure socket layer 安全套接层)/TLS(Transport Layer Security 传输层安全)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
SSL是传输层的一种安全协议。SSL协议建立在可靠的TCP传输控制协议之上,并且与上层协议无关,各种应用层协议(如:HTTP,FTP,TELNET等)能通过SSL协议进行透明传输。TLS是1999年推出的对SSL的改进版本。
SSL/TLS在web中应用就是https。
SSL协议分为两层:SSL握手协议和SSL记录协议。
问题汇总
生产环境遇到问题:外网情况,客户网络访问本地http路径,本地做了http跳转到https 302。 部分客户环境可以正常范围,部分客户环境返回的302带的新路径ip地址被替换增加了一段新ip地址,可能是网关,或者反火墙做了302的限制
- 在客户端抓包发现http获取下载文件的路径被替换
- 在客户那边使用下面正确的不进行跳转的路径进行测试
curl –insecure -v -o ff.tar.gz https://121.3.3.3:443/data/upload/version/ff.tar.gz - 在服务端也进行抓包查看服务端返回的包是否正常
- 解决方法就是不使用302跳转,直接使用最终地址
想要程序监听多个端口方法?
- 可以使用Linux端口转发功能NAT,可以转发到不同服务器的不同端口(本机也是可以的,Nginx可以转发http请求)。其他命令
1
2
3
4
5vi /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删除规则用-D1
2iptables -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端口)
新技术
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吞吐能力