Python 网络编程(4)网络编程基础:C/S架构(五层模型)

网络编程基础:C/S架构

  • 1. C/S 架构
  • 2. 互联网协议(Internet Protocol Suite)
    • 2.1 物理层
    • 2.2 数据链路层
    • 2.3 网络层:主机到主机的通信
      • 网络层概述
      • IP协议
      • IP数据包
      • ARP协议
    • 2.4 传输层:端口到端口的通信
      • TCP协议
      • UDP协议
      • socket
  • 3. 后续阅读

1. C/S 架构

C指的是client(客户端软件),S指的是Server(服务端软件)C/S架构就是基于网络实现客户端与服务端通信的软件架构,能够实现服务端软件与客户端软件基于网络通信。

2. 互联网协议(Internet Protocol Suite)

网络 = 物理链接介质 + 互联网协议 (之前真的理解了“网络”?)

计算机之间的通信标准,这个标准称之为互联网协议(Internet Protocol Suite),按照功能不同,人们将互联网协议分为 OSI七层TCP/IP五层 或 四层(只需要掌握TCP/IP五层协议即可)。

互联网协议常被通称为TCP/IP协议族(英语:TCP/IP Protocol Suite,或TCP/IP Protocols),简称TCP/IP。因为该协议家族的两个核心协议:TCP(传输控制协议)和IP(网际协议)。

Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第1张图片

如图所示,最下面的一层是物理层/实体层(Physical Layer),最上面的一层叫做应用层(Application Layer)。越靠下越靠近硬件;越靠上越接近用户。

这些层叫什么名称不必细究,只需要明白互联网分为若干层,每一层都是为了完成一种功能。
为了实现这些功能,就需要大家都遵守共同的规则,即 "协议" (protocol),所有协议的总称叫做互联网协议,它们是互联网的核心

2.1 物理层

Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第2张图片

  • 由来:计算机之间的通信,必须接入网络,即完成组网。可以用光缆、电缆、双绞线、无线电波等方式
  • 功能:规定了网络的一些电气特性,作用是基于电器特性发送高电压(1)低电压(0)(电信号)

2.2 数据链路层

  • 由来:单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思
  • 功能:定义了电信号的分组方式——以太网协议ethernet

(1)信号分组ethernet协议
以太网协议: 早期的时候各个公司都有自己的分组方式,后来形成了统一的标准,即以太网协议ethernet

  • 一组电信号构成一个数据包,叫
  • 每一数据帧分成:报头head数据data两部分 Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第3张图片
    "标头"(Head)包含数据包的一些说明项,比如发送者、接受者、数据类型等等;
    "数据"(Data)则是数据包的具体内容。 "标头"的长度,固定为18字节。"数据"的长度,最短为46字节,最长为1500字节。 因此,整个"帧"最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送。

(2)数据标识Mac地址
上面提到,以太网数据包的"标头",包含了发送者和接受者的信息。而发送者和接受者是通过网卡的地址来进行标识,这个地址也叫Mac地址

以太网规定,连入网络的所有设备,都必须具有"网卡"接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做MAC地址。
Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第4张图片
每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示。
Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第5张图片
前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就可以定位网卡和数据包的路径了。

(3)数据传输:广播

  • 一块网卡通过ARP协议知道另一块网卡的地址
  • 系统通过广播(broadcasting)将数据包送到接收方

ethernet采用最原始的方,广播的方式进行通信,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。这种发送方式就叫做**“广播”(broadcasting)**
Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第6张图片
上图中,1号计算机向2号计算机发送一个数据包,同一个子网络的3号、4号、5号计算机都会收到这个包。它们读取这个包的"标头",找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。

有了数据包的定义、网卡的MAC地址、广播的发送方式,"链接层"就可以在多台计算机之间传送数据了。

2.3 网络层:主机到主机的通信

网络层概述

有了ethernet、mac地址、广播的发送方式,世界上的计算机就可以彼此通信了问题是世界范围的互联网并非是单独的一个超大网络组成,而是由一个个彼此隔离的小的局域网组成的,也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。

Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第7张图片

  • 由来:必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是,就采用路由的方式(向不同广播域/子网分发数据包),mac地址是无法区分的,它只跟厂商有关

  • 功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址,简称**”网址“**。

"路由"的意思,就是指如何向不同的子网络分发数据包,这是一个很大的主题,本文不涉及。

于是,"网络层"出现以后,每台计算机有了两种地址,一种是MAC地址,另一种是网络地址。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。

网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理MAC地址。
Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第8张图片

IP协议

  • 规定网络地址的协议:IP(Internet protocol)协议
  • ip协议定义的地址称之为ip地址,目前,广泛采用的是IP协议第四版,简称IPv4,它规定网络地址由32位2进制表示。
    Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第9张图片

习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255

互联网上的每一台计算机,都会分配到一个IP地址。这个地址分成两个部分,前一部分代表网络,后一部分代表主机。处于同一个子网络的电脑,它们IP地址的网络部分必定是相同的,也就是说172.16.254.2应该与172.16.254.1处在同一个子网络。

但是,问题在于单单从IP地址,我们无法判断网络部分。

对于IP地址172.16.254.1,可以有以下分法:

  • 网络部分:172;主机部分:16.254.1
  • 网络部分:172.16;主机部分:254.1
  • 网络部分:172.16.254;主机部分:1

这就要用到另一个参数"子网掩码"(subnet mask),所谓"子网掩码",就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。
比如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0

总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络

IP数据包

根据IP协议发送的数据,就叫做IP数据包。不难想象,其中必定包括IP地址信息:
Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第10张图片
不用修改以太网的规格,把IP数据包直接放进以太网数据包的"数据"部分,以太网数据包就变成了下面这样:
Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第11张图片

IP数据包的"标头"部分的长度为20到60字节,整个数据包的总长度最大为65,535字节。因此,理论上,一个IP数据包的"数据"部分,最长为65,515字节。

前面说过,以太网数据包的"数据"部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了

ARP协议

因为IP数据包是放在以太网数据包里发送的,所以我们必须同时知道两个地址,一个是对方的MAC地址,另一个是对方的IP地址。通常情况下,对方的IP地址是已知的(后文会解释),但是我们不知道它的MAC地址

所以,我们需要一种机制,能够从IP地址得到MAC地址。
这里又可以分成两种情况。

第一种情况,如果两台主机不在同一个子网络,那么事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的**“网关”(gateway)**,让网关去处理。

第二种情况,如果两台主机在同一个子网络,那么我们可以用ARP协议,得到对方的MAC地址。ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个"广播"地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。

总之,有了ARP协议之后,我们就可以得到同一个子网络内的主机MAC地址,可以把数据包发送到任意一台主机之上了。

2.4 传输层:端口到端口的通信

有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。

  • 由来:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,那么我们通过ip和mac找到了一台特定的主机,如何标识这台主机上的应用程序呢?答案就是端口(port),端口即应用程序与网卡关联的编号

  • 功能:建立端口到端口的通信

  • 补充:端口范围0-655350-1023为系统占用端口。不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。

"传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。
只要确定主机和端口,我们就能实现程序之间的交流
因此,Unix系统就把主机+端口,叫做"套接字"(socket)。有了它,就可以进行网络应用程序开发了。

传输层有两种协议TCPUDP

Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第12张图片

TCP协议

TCP(Transmission Control Protocol,传输控制协议)是可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
在这里插入图片描述

为什么tcp是可靠的数据传输呢?
最可靠的方式就是只要不得到确认,就重新发送数据报,直到得到对方的确认为止。

TCP面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次“对话”才能建立起来。

Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第13张图片

基于tcp协议通信,为何建立链接需要三次握手,而断开链接却需要四次挥手
因为建立链接时server端的ACK和SYN是一起发的,而断开时,为了保证数据的完整发送到client是分开发送的。

更多可以参考:TCP和UDP的区别

UDP协议

UDP(User Data Protocol,用户数据报协议)是不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
在这里插入图片描述

UDP,UDP是一个非连接的协议,传输数据之前源端和终端不建立连接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

更多可以参考:TCP和UDP的区别

  • 小结

TCP协议虽然安全性很高,但是网络开销大,而UDP协议虽然没有提供安全机制,但是网络开销小,在现在这个网络安全已经相对较高的情况下,为了保证传输的速率,我们一般还是会优先考虑UDP协议

socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部。

套接字的特性由3个属性确定,它们分别是:域、端口号、协议类型。

  • 套接字的域:AF_INET、AF_UNIX
  • 套接字的端口号:范围是0-65535
  • 套接字协议类型:SOCK_STREAM、SOCK_DGRAM、原始套接字

具体用法可以看下图,或者点击:Python 网络编程(5):socket 介绍和使用案例
Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第14张图片

3. 后续阅读

偶然发现一篇很硬核的文章:
一篇文章带你熟悉 TCP/IP 协议(网络协议篇二)
有空可以好好约阅读。

目录如下:
Python 网络编程(4)网络编程基础:C/S架构(五层模型)_第15张图片

主要参考:

  1. Python网络编程总结
  2. 互联网协议入门(一)——再次遇见阮大佬
  3. TCP 协议简介——接上面的TCP后续
  4. 一篇文章带你熟悉 TCP/IP 协议(网络协议篇二)——一篇全面且详细的文章,非常硬核!

你可能感兴趣的:(计算机网络)