0%

网络通信学习笔记

网络通信是基于域名解析的IP地址进行通信。计算机在网络上以发送数据包的形式进行网络通信并遵循TCP/IP通信协议,TCP/IP通信是寻找“最近点”进行跳跃,而不是寻找完整路径进行跳跃,因此整个互联网通信是建立在下一跳模式上。本文主要简单介绍TCP/IP协议,以及三种常用的网络通信模型

TCP/IP协议

根据7层OSI(Open System Interconnect)参考模型得到了TCP/IP(Transmission Control Protocol/Internet Protocol)四层模型

TCP/IP四层模型

下面介绍TCP/IP四层模型中每一层的作用以及相应的协议

7层应用层

应用层常用的协议有http协议,ssh协议等,其中http协议就是用来描述将数据如何格式化表示,应用层是负责使得交互的内容遵从某种表示格式,比如ssh在客户端排版的格式,server那边就能读懂,server回馈的客户端就能解析

4层传输控制层

传输控制层的主要工作是三次握手,数据传输以及四次分手,主要工作有两方面

  1. 建立连接

    这里的连接不是物理连接,而是确认过眼神的连接(得到对方的确认)

  2. 申请端口号

    在客户端随机申请一个端口号来发送信息,端口号不等于进程号,但是二者有一定的映射关系,可以通过netstat -natp命令来查看客户端的IP和port,服务器的IP和port,其中natp的含义:

    1)n表示显示IP

    2)a表示all

    3)t表示tcp

    4)p表示进程

传输控制层的握手流程图

其中第一步是发送sync数据包(握手包),服务器接收数据包之后返回sync+ack数据包表示确认接收,第三步就是发送ack数据包表示客户端确认接收了服务端的数据包;第1次和第2次握手是从客户端的角度确认了输出(被接收到)和输入,第2次和第3次从服务端的角度确认了确认了输出(被接收到)和输入

传输控制层的握手流程图

其中第一步是发送分手包,第二步是确认分手包,第三步是我也分手包,第四步是返回同意

3层网络层

IP的构造是点分字节,为了读取方便将二进制转成了十进制,每一个点之间的范围在0~255,IP的构造采用了分治的思想(可以通过hash取模,然后线性遍历,或者优化后的红黑树遍历)进而可以快速定位。从IP可以读取以下两部分内容

  1. 网络号地址:掩码与IP取与
  2. 主机地址:IP最后一点的后面三位

根据route -n命令可以查看路由表,显示网关(路由器)的IP地址,互联网就是小网拼成大网,路由表的第一列就是网络号,即IP与子网掩码做与运算得到的。如果匹配的网络号是本地网络号,对应的网关IP(也就是下一跳)就是0.0.0.0,并且那么就不需要进行下一跳而是直接在自己的网络中进行通信

2层链路层

可以通过arp - a命令来查看网关的IP和硬件地址(网卡地址,MAC地址)的映射,这样就可以地址找到下一跳的硬件地址,在最开始提到的数据包中的MAC地址就是硬件地址(经典的传纸条例子)

补充

同一个网络中的计算机在最开始的时候是通过ARP协议偷偷获取网关的MAC地址。具体流程是最开始计算机A会先发一个小的数据包,里面封装了目标IP就是网关B的IP,然后通过交换机发给同一个网络中的所有计算机,然后同一个网络中除了路由器以外的其他计算机拆开数据包发现不是发给自己的都会直接丢掉,而只有网关B收到数据包之后根据计算机A的IP地址通过交换机直接回复数据包给计算机A,这个时候机器A就拥有了网关B的MAC地址

通信流程

  1. 7层建立表达格式的限制
  2. 4层建立握手包,但不发送
  3. 3层IP确认网络号
  4. 2层确认吓一跳
  5. 4层发送握手包建立通信
  6. 7层发送请求

3种通信模型

IP是逻辑上的两个端点(客户端和服务端),端点间的TCP传输有三个特点,确认机制,状态机制(根据状态分析数据包)以及不可分割(比如3次握手,4次分手都不可分割),IP分成私有IP和公有IP,其中私有IP不能发送到互联网中(因为私有IP不唯一);MAC(硬件的网卡地址)是物理上的两个节点(每一条都更换MAC地址)。下面简单介绍家里的网络通信原理

从上述图片看出可能存在一些问题,假设家里的两台设备将数据包经过路由器发送到外部,如果发送的数据包申请的端口号都一样,经过路由器转换之后变成了相同的IP以及端口号,那么接收数据包的时候就不知道将数据包返回给哪一台设备,这个时候需要借助路由器内部存储的路由表,它是记录路由器给每发送出去的数据包随机申请一个端口号,将其与设备的私有ip+端口号建立映射关系,这样等返回数据包的时候根据路由表的映射关系就可以判断出来将其返回给哪一台设备。

在介绍三种通信模型之前需要介绍4个名词

  1. CIP:客户端IP地址

  2. VIP:虚拟服务器地址,也就是客户端访问网站域名解析完的IP

  3. DIP:负责转发的IP地址

    1)和RIP通信:遵循ARP协议,获取Real Server的RIP(MAC地址)

  4. RIP(Real):后端真实主机(后端服务器)的IP

D-NAT

后端的各个服务器必须是镜像的,不要出现从不同服务器接受的网页信息是不一致的

有一个细节就是将数据包发送到real server的时候socket对应关系(TCP关系)是CIP的端口号对应RIP的端口号,如果和VIP没有任何关系,发送的返回数据包是RIP_CIP,如果直接发送给客户端的话,客户端直接就会丢弃,所以解决办法就是通过负载均衡服务器,然后负载均衡服务器将RIP_CIP恢复成VIP_CIP就可以了,为了让Real Server将数据包发送给负载均衡服务器,需要将默认网关(掩码是4个0)指向负载均衡服务器,这样以后无论客户端的IP地址无论怎么变换,只要和4个0做与运算,就会指向默认网关,即下一跳一定是负载均衡服务器。

局限性在于发送需要做一次D_NAT,返回也需要做一次D_NAT,压力有点过大,在互联网中请求是小量的,请求的东西是大量的,所以IO实际上是不对称的。比如在同一个带宽可能由5万个请求,可能恢复1个请求的东西,所以运营商会将网络传输设计成上传的带宽(波段)压低,下载的的带宽提高。

四层DR

为了减缓接受压力,将RIP接收的数据包通过网络直接传输回客户端,由于需要遵循TCP协议即一台机器只能暴露一个IP,所以需要将VIP隐藏起来,即对外隐藏对内可见

局限性在于服务器和负载均衡要在同一个局域网(交换机)中,应用场景就是互联网的数据中心

隧道

IP背着IP,允许负载和服务器离的远一点