全栈必备:网络编程基础

七层模型

七层模型(OSI,Open System Interconnection参考模型),是参考是国际标准化组织制定的一个用于计算机或通信系统间互联的标准体系。它是一个七层抽象的模型,不仅包括一系列抽象的术语和概念,也包括具体的协议。 经典的描述如下:

简述每一层的含义:

物理层(Physical Layer):建立、维护、断开物理连接。

数据链路层 (Link):逻辑连接、进行硬件地址寻址、差错校验等。

网络层 (Network):进行逻辑寻址,实现不同网络之间的路径选择。

传输层 (Transport):定义传输数据的协议端口号,及流控和差错校验。

会话层(Session Layer):建立、管理、终止会话。

表示层(Presentation Layer):数据的表示、安全、压缩。

应用层 (Application):网络服务与最终用户的一个接口

每一层利用下一层提供的服务与对等层通信,每一层使用自己的协议。了解了这些,然并卵。但是,这一模型确实是绝大多数网络编程的基础,作为抽象类存在的,而TCP/IP协议栈只是这一模型的一个具体实现。

TCP/IP 协议模型

TCP/IP是Internet的基础,是一组协议的代名词,包括许多协议,组成了TCP/IP协议栈。TCP/IP 有四层模型和五层模型之说,区别在于数据链路层是否作为独立的一层存在。个人倾向于5层模型,这样2层和3层的交换设备更容易弄明白。当谈到网络的2层或3层交换机的时候,就知道指的是那些协议。

数据是如何传递呢?这就要了解网络层和传输层的协议,我们熟知的IP包结构是这样的:

IP协议和IP地址是两个不同的概念,这里没有涉及IPV6的。不关注网络安全的话,对这些结构不必耳熟能详的。传输层使用这样的数据包进行传输,传输层又分为面向连接的可靠传输TCP和数据报UDP。TCP的包结构:

TCP 连接建立的三次握手肯定是必知必会,在系统调优的时候,内核中关于网络的相关参数与这个图息息相关。UDP是一种无连接的传输层协议,提供的是简单不可靠的信息传输。协议结构相对简单,包括源和目标的端口号,长度以及校验和。基于TCP和UDP的数据封装及解析示例如下:

还是然并卵么?一个数据包的大小了解了,会发现什么?PayLoad到底是多少?在设计协议通信的时候,这些都为我们提供了粒度定义的依据。进一步,通过一个例子看看吧。

模型解读示例

FTP是一个比较好的例子。为了方便起见,假设两条计算机分别是A 和 B,将使用FTP 将A上的一个文件X传输到B上。

首先,计算机A和B之间要有物理层的连接,可以是有线比如同轴电缆或者双绞线通过RJ-45的电路接口连接,也可以是无线连接例如WIFI。先简化一下,考虑局域网,暂不讨论路由器和交换机以及WIFI热点。这些物理层的连接建立了比特流的原始传输通路。

接下来,数据链路层登场,建立两台计算机的数据链路。如果A和B所在的网络上同时连接着计算机C,D,E等等,A和B之间如何建立的数据链路呢?这一过程就是物理寻址,A要在众多的物理连接中找到B,依赖的是计算机的物理地址即MAC地址,对就是网卡上的MAC地址。以太网采用CSMA/CD方式来传输数据,数据在以太网的局域网中都是以广播方式传输的,整个局域网中的所有节点都会收到该帧,只有目标MAC地址与自己的MAC地址相同的帧才会被接收。A通过差错控制和接入控制找到了B的网卡,建立可靠的数据通路。

那IP地址呢? 数据链路建立起来了,还需要IP地址么?我们FTP 命令中制定的是IP地址而不是MAC地址呀?IP地址是逻辑地址,包括网络地址和主机地址。如果A和B在不同的局域网中,中间有着多个路由器,A需要对B进行逻辑寻址才可以的。物理地址用于底层的硬件的通信,逻辑地址用于上层的协议间的通信。在以太网中:逻辑地址就是IP地址,物理地址就是MAC 地址。在使用中,两种地址是用一定的算法将他们两个联系起来的。所以,IP是用来在网络上选择路由的,在FTP的命令中,IP中的原地址就是A的IP地址,目标地址就是B的IP地址。这应该就是网络层,负责将分组数据从源端传输到目的端。

A向B传输一个文件时,如果文件中有部分数据丢失,就可能会造成在B上无法正常阅读或使用。所以需要一个可靠的连接,能够确保传输过程的完整性,这就是传输层的TCP协议,FTP就是建立在TCP之上的。TCP的三次握手确定了双方数据包的序号、最大接受数据的大小(window)以及MSS(Maximum Segment Size)。TCP利用IP完成寻址,TCP中的提供了端口号,FTP中目的端口号一般是21。传输层的端口号对应主机进程,指本地主机与远程主机正在进行的会话。

会话层用来建立、维护、管理应用程序之间的会话,主要功能是对话控制和同步,编程中所涉及的session是会话层的具体体现。表示层完成数据的解编码,加解密,压缩解压缩等,例如FTP中bin命令,代表了二进制传输,即所传输层数据的格式。 

HTTP协议里body中的Json,XML等都可以认为是表示层。应用层就是具体应用的本身了,FTP中的PUT,GET等命令都是应用的具体功能特性。

简单地,物理层到电缆连接,数据链路层到网卡,网络层路由到主机,传输层到端口,会话层维持会话,表示层表达数据格式,应用层就是具体FTP中的各种命令功能了。

 

网络编程

了解了7层协议模型和操作系统层面的Socket实现,可以方便我们理解网络编程。

在系统架构的时候,有重要的一环就是拓扑架构,这里涉及了网络等基础设施,那么7层协议下四层就会有助于我们对业务系统网络结构的观察和判断。在系统设计的时候,往往采用面向接口的设计,而接口也往往是基于HTTP协议的Restful API。 那接口的粒度就可以将data segment作为一个约束了,同时可以关注到移动互联网中的弱网环境。

不同的编程语言,有着不同的框架和库,真正的编写网络程序代码并不复杂,例如,用Erlang 中 gen_tcp 用于编写一个简单的Echo服务器:

然而,写出漂亮的服务器程序仍然是一件非常吃功夫的事情,例如,个人非常喜欢的python Tornado 代码, 在ioloop.py 中有对多路复用的选择:

在HTTPServer.py 中同样继承了TCPServer,进而实现了HTTP协议,代码片段如下:

或许,老码农说的都是错的,了解了所谓的网络基础,也不一定写出漂亮的代码,不了解所谓的网络基础,也不一定写不出漂亮的代码,全当他自言自语吧。

END

碧茂课堂精彩课程推荐:

1.Cloudera数据分析课;

2.Spark和Hadoop开发员培训;

3.大数据机器学习之推荐系统;

4.Python数据分析与机器学习实战;

详情请关注我们公众号:碧茂大数据-课程产品-碧茂课堂

现在注册互动得海量学币,大量精品课程免费送!

猜你喜欢

转载自blog.csdn.net/ShuYunBIGDATA/article/details/92969676