1、网络编程模型:认识客户端-服务器网络模型的基本概念

1.1、OSI模型和TCP/IP协议栈

1.2、客户端 - 服务器网络编程模型

网络购物来说,我们在手机上的每次操作,都是作为客户端向服务器发送请求,并收到响应的例子。

过程:

  1. 当一个客户端需要服务时,比如网络购物下单,它会向服务器端发送一个请求。 注意,这个请求是按照双方约定的格式来发送的,以便保证服务器端是可以理解的;
  2. 服务器端收到这个请求后,会根据双方约定的格式解释它,并且以合适的方式进行操作,比如调用数据库操作来创建一个购物单;
  3. 服务器端完成处理请求之后,会给客户端发送一个响应,比如向客户端发送购物单的实际付款额,然后等待客户端的下一步操作;
  4. 客户端收到响应并进行处理,比如在手机终端上显示该购物单的实际付款额,并且让用户选择付款方式。

客户端 - 服务器模型时,是使用 TCP 还是 UDP?

二者的区别: TCP 中连接是谁发起的,在 UDP 中报文是谁发送的。

在 TCP 通信中,建立连接是一个非常重要的环节。区别出客户端和服务器,本质上是因为二者编程模型是不同的。

服务端:

​ 服务器端需要在一开始就监听在一个众所周知的端口上,等待客户端发送请求,一旦有客户端连接建立,服务器端就会消耗一定的计算机资源为它服务,服务器端是需要同时为成千上万的客户端服务的。如何保证服务器端在数据量巨大的客户端访问时依然能维持效率和稳定,这也是我们讲述高性能网络编程的目的。

客户端:

​ 向服务器端的监听端口发起连接请求,连接建立之后,通过连接通路和服务器端进行通信。

注意:客户端和服务器端,它们运行的单位都是进程(process),而不是机器。

  • 客户端: 比如我们的手机终端,同一个时刻可以建立多个到不同服务器的连接,比如同时打游戏,上知乎,逛天猫;
  • 服务器端: 在一台机器上部署运行了多个服务,比如同时开启了 SSH 服务和 HTTP 服务。

1.3、IP 和端口

正如寄信需要一个地址一样,在网络世界里,同样也需要地址的概念。在 TCP/IP 协议栈中,IP 用来表示网络世界的地址。

在一台计算机上是可以同时存在多个连接的,那么如何区分出不同的连接呢?

端口:

​ 拿住酒店举例子,酒店的地址是唯一的,每间房间的号码是不同的;类似的,计算机的 IP 地址是唯一的,每个连接的端口号是不同的。

端口号是一个 16 位的整数,最多为 65536。

  • 当一个客户端发起连接请求时,客户端的端口是由操作系统内核临时分配的,称为临时端口;
  • 服务器端的端口通常是一个众所周知的端口。

一个连接可以通过客户端 - 服务器端的 IP 和端口唯一确定,这叫做套接字对,按照下面的四元组表示:

(clientaddr:clientport, serveraddr: serverport)

客户端 - 服务器之间的连接:

1.4、保留网段

一个比较常见的现象:

​ 我们所在的单位或者组织,普遍会使用诸如 10.0.x.x 或者 192.168.x.x 这样的 IP 地址,你可能会纳闷,这样的 IP 到底代表了什么呢?不同的组织使用同样的 IP 会不会导致冲突呢?

原因:

​ 国际标准组织在 IPv4 地址空间里面,专门划出了一些网段,这些网段不会用做公网上的 IP,而是仅仅保留作内部使用,我们把这些地址称作保留网段。

下表是三个保留网段,其可以容纳的计算机主机个数分别是 16777216 个、1048576 个和 65536 个。

详细讲述这个表格之前,需要先了解一下子网掩码概念。

1.5、子网掩码

在网络 IP 划分的时候,需要区分两个概念

ip号 = 网络 + 主机

第一是网络(network)的概念, 直观点说,它表示的是这组 IP 共同的部分,比如在 192.168.1.1~192.168.1.255 这个区间里,它们共同的部分是 192.168.1.0。

第二是主机(host)的概念, 它表示的是这组 IP 不同的部分,上面的例子中 1~255 就是不同的那些部分,表示有 255 个可用的不同 IP。

例如 IPv4 地址,192.0.2.12,我们可以说前⾯3 个字节(byte) 是⼦⽹(subnet),最后 1 个字节是主机,或者换个⽅式,我们能说主机为 8 位,⼦⽹掩码为 192.0.2.0/24(255.255.255.0)。

1、很久以前的子网分类

一个 IPv4 地址的第一个,前两个或前三个 字节是属于网络的一部分。

1、ClassA网络—IPv4 地址的第 1 个字节⽹络,另外 3 个字节表示主机地址

在你的⽹络⾥,你有价值 3 个字节,也就是 24 个⽐特的主机地址,这是什么概念呢? 2 的 24 次⽅,⼤约是⼀千六百万个地址左右(图中 Number of addresses)。这是⼀个“Class A”(A 类)⽹络。

表格第⼀⾏就是这样⼀个 A 类⽹络,10 对应的是⽹络字节部分,主机部分是 3 个字节,我们将第⼀个字节的⼦⽹掩码记作 255.0.0.0。

2、ClassB网络—IPv4 地址的前2个字节为⽹络,后2个字节表示主机地址

host 只有两个字节,也就是说拥有的主机个数为 65536。

3、ClassC网络—IPv4 地址的前字节3为⽹络,后1个字节表示主机地址

host 只有一个 字节,也就是说拥有的主机个数为 256。

2、子网分类

网络地址位数由子网掩码(Netmask)决定,IP 地址与子网掩码进行“位与”操作,就能得到网络的值。

子网掩码一般看起来像是 255.255.255.0(二进制为 11111111.11111111.11111111.00000000)

比如你的 IP 是 192.0.2.12,使用这个子网掩码时,你的网络就会是 192.0.2.12 与 255.255.255.0 所得到的值:192.0.2.0,192.0.2.0 就是这个网络的值。

子网掩码能接受任意个位,而不单纯是上面讨论的 8,16 或 24 个比特而已。

所以你可以有一个子网掩码 255.255.255.252(二进制位 11111111.11111111.11111111.11111100),这个子网掩码能切出一个 30 个位的网络以及 2 个位的主机,这个网络最多有四台主机。

为什么是 4 台主机呢?因为不变的部分只有最后两位,所有的可能为 2 的 2 次方,即 4 台主机。

注意: 子网掩码的格式永远都是二进制格式:前面是一连串的 1,后面跟着一连串的 0。

问题: 一大串的数字会有点不好用,比如像 255.192.0.0 这样的子网掩码,人们无法直观地知道有多少个 1,多少个 0;

解决方法:

​ 将一个斜线放在 IP 地址后面接着用一个十进制的数字用以表示网络的位数,类似这样:192.0.2.12/30, 这样就很容易知道有 30 个 1, 2 个 0,所以主机个数为 4。

1.6、全球域名系统

​ 如果每次要访问一个服务,都要记下这个服务对应的 IP 地址,无疑是一种枯燥而繁琐的事情,就像你要背下 200 多个好友的电话号码一般无聊。

​ 正如电话簿记录了好友和电话的对应关系一样,域名(DNS)也记录了网站和 IP 的对应关系。

​ 全球域名按照从大到小的结构,形成了一棵树状结构。实际访问一个域名时,是从最底层开始写起,例如 www.google.com,www.tinghua.edu.cn等。

1.7、数据报和字节流

在OSI 和 TCP/IP 协议栈的对比中,我们看到传输层其实是有两种协议的,一种是大家广为熟悉的 TCP, 而另一种就是 UDP。

TCP叫做字节流套接字(Stream Socket);

UDP 也有一个类似的叫法, 数据报套接字(Datagram Socket);

一般分别以“SOCK_STREAM”与“SOCK_DGRAM”分别来表示 TCPUDP 套接字。

Datagram Sockets 有时称为“无连接的 sockets”(connectionless sockets)。

Stream sockets 是可靠的、双向连接的通讯串流。比如以“1-2-3”的顺序将字节流输出到套接字上,它们在另一端一定会以“1-2-3”的顺序抵达,而且不会出错。

这种高质量的通信是如何办到的呢?

​ 这就是由 TCP(Transmission Control Protocol)协议完成的,TCP 通过诸如连接管理,拥塞控制,数据流与窗口管理,超时和重传等一系列精巧而详细的设计,提供了高质量的端到端的通信方式

应用:

TCP(字节流套接字): 浏览器访问网页、手机端用天猫 App 购物

UDP : 多人联网游戏、视频会议,甚至聊天室。(UDP速度快)

广播或多播的技术: 就是向网络中的多个节点同时发送信息,这个时候,选择 UDP 更是非常合适的。

总结

主要介绍了客户端 - 服务器网络编程模型,初步介绍了 IP 地址、端口、子网掩码和域名等基础概念;

  • 网络编程需要牢牢建立起“客户端”和“服务器”模型,两者编程的方法和框架是明显不同的;
  • TCP 连接是客户端 - 服务器的 IP 和端口四元组唯一确定的,IP 是一台机器在网络世界的唯一标识;
  • 有两种截然不同的传输层协议,面向连接的“数据流”协议 TCP,以及无连接的“数据报”协议 UDP。

思考题

1、保留地址中第二行 172.16.0.0/12 描述为 16 个连续的 B 段,第三行 192.168.0.0/16 描述为 256 个连续的 C 段地址,怎么理解这种描述呢?

  • 172.16.0.0172.31.255.255,因为b类网络的host只占最后两个字节,172.16172.31就代表了16个连续的b类网络可用;
  • 192.168.0.0~192.168.255.255,因为c类网络的host只占最后一个字节,所以从192.168.0到192.168.255,就有256个连续的c类网络可用

2、服务端必须侦听在一个众所周知的端口上,这个端口怎么选择,又是如何让客户端知道的呢?

  • 服务器可以监听的端口有从0到65535,理论上这台服务器的这个端口只要没被占用,你都可以给服务器绑定。
  • 如果是一些默认的服务,服务器绑的也是默认的端口,那么客户端是可以知道的。比如:80是给http服务,443是给https服务,21是给ftp服务等。否则的话,就需要服务器开发者告诉客户端应该连接哪个端口

2-网络编程模型:认识客户端-服务器网络模型的基本概念相关推荐

  1. 【Java——网络编程基础之客户端服务器连接】

    网络编程 1.1软件结构 1.2 网络通信协议 1.3 协议分类 1.4网络编程三要素 协议 IP地址 端口号 TCP通信程序 2.1 概述 2.2 Socket类 构造方法 成员方法 2.3 Ser ...

  2. 朴素、Select、Poll和Epoll网络编程模型实现和分析——朴素模型

    做Linux网络开发,一般绕不开标题中几种网络编程模型.网上已有很多写的不错的分析文章,它们的基本论点是差不多的.但是我觉得他们讲的还不够详细,在一些关键论点上缺乏数据支持.所以我决定好好研究这几个模 ...

  3. alin的学习之路(Linux网络编程:一)(网络模型、帧格式、socket套接字、服务器端实现)

    alin的学习之路(Linux网络编程:一)(网络模型.帧格式.socket套接字.服务器端实现) 1. 协议 协议是一组规则,规定了如何发送数据.通信的双发都需要遵守该规则 2. 网络分层结构模型 ...

  4. 朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll、Epoll模型处理长连接性能比较

    在<朴素.Select.Poll和Epoll网络编程模型实现和分析--模型比较>一文中,我们分析了各种模型在处理短连接时的能力.本文我们将讨论处理长连接时各个模型的性能.(转载请指明出于b ...

  5. 朴素、Select、Poll和Epoll网络编程模型实现和分析——Epoll模型

    在阅读完<朴素.Select.Poll和Epoll网络编程模型实现和分析--Select模型>和<朴素.Select.Poll和Epoll网络编程模型实现和分析--Poll模型> ...

  6. 朴素、Select、Poll和Epoll网络编程模型实现和分析——Poll模型

    在<朴素.Select.Poll和Epoll网络编程模型实现和分析--Select模型>中,我们分析了它只能支持1024个连接同时处理的原因.但是在有些需要同时处理更多连接的情况下,102 ...

  7. 朴素、Select、Poll和Epoll网络编程模型实现和分析——Select模型

    在<朴素.Select.Poll和Epoll网络编程模型实现和分析--朴素模型>中我们分析了朴素模型的一个缺陷--一次只能处理一个连接.本文介绍的Select模型则可以解决这个问题.(转载 ...

  8. aio 系统原理 Java_Java新一代网络编程模型AIO原理及Linux系统AIO介绍

    从JDK 7版本开始,Java新加入的文件和网络io特性称为nio2(new io 2, 因为jdk1.4中已经有过一个nio了),包含了众多性能和功能上的改进,其中最重要的部分,就是对异步io的支持 ...

  9. 手把手教你玩转网络编程模型之完成例程(Completion Routine)篇(上)-转

    手把手教你玩转网络编程模型之完成例程(Completion Routine)篇 前  言 记得写这个系列的上一篇文章的时候已经是四年前了,准确的说是四年半以前了,翻开我尘封已久的IO模型里面的&quo ...

最新文章

  1. pandas.DataFrame.to_dict()的使用详解
  2. HDU 1198 Farm Irrigation
  3. 本地tomcat的start.bat启动时访问不出现小猫图标
  4. pexpect.spawn timeout 无限_【元气骑士最新无限钻石版】元气骑士游戏无限钻石版下载...
  5. 写给大数据开发初学者的话
  6. 使用Spring的NamedParameterJdbcTemplate完成DAO操作
  7. HDU - 4370 0 or 1(思维+最短路)
  8. 计算机基础知识题库选择题,计算机基础知识篇选择题库
  9. WEB三大攻击之—XSS攻击与防护
  10. HTML5中的自定义属性总结
  11. eclipse设置java虚拟机内存大小_eclipse设置java虚拟机内存大小
  12. (ACL+ICML)2020推荐系统相关论文聚焦(附下载链接)
  13. 自考计算机应用技术题,全国自考计算机应用技术试题及答案解析-20210522014558.docx-原创力文档...
  14. Mybatis—三剑客之generator使用方法
  15. oracle查询当天数据三种方式性能对比
  16. sql 服务器时间修改时间,教您如何修改sql server时间
  17. 欧阳娜娜从阿里跳槽网易:阿里P8堪称教科书级别的面试现场!最后一个问题亮了...
  18. win7系统如何加速计算机启动,怎么使win7系统开机加速
  19. CDR真实图片转水墨画效果制作教程
  20. GO语言开发天天生鲜项目第三天 用户模块开发

热门文章

  1. Keil开发环境的搭建送安装包
  2. Meshgrid函数的基本用法
  3. php德育元素,职业院校德育课程教学中的美育元素
  4. 如何进行并行编程:从并行矩阵运算开始
  5. Oracle 如何设置外键约束
  6. dart-sass与node-sass介绍
  7. 教大家用Xposed,findAndHookMethod方法修改第三方应用方法返回值
  8. 天猫DTC:冲破流量,冲向用户
  9. 一文详解老薛主机如何安装zblogphp程序
  10. twisted 实现UDP服务