网络编程实战
盛延敏
前大众点评云平台首席架构师
立即订阅
6034 人已学习
课程目录
已完结 39 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 学好网络编程,需要掌握哪些核心问题?
免费
第一模块:基础篇 (9讲)
01 | 追古溯源:TCP/IP和Linux是如何改变世界的?
02 | 网络编程模型:认识客户端-服务器网络模型的基本概念
03丨套接字和地址:像电话和电话号码一样理解它们
04 | TCP三次握手:怎么使用套接字格式建立连接?
05 | 使用套接字进行读写:开始交流吧
06 | 嗨,别忘了UDP这个小兄弟
07 | What? 还有本地套接字?
08 | 工欲善其事必先利其器:学会使用各种工具
09丨答疑篇:学习网络编程前,需要准备哪些东西?
第二模块:提高篇 (10讲)
10 | TIME_WAIT:隐藏在细节下的魔鬼
11 | 优雅地关闭还是粗暴地关闭 ?
12 | 连接无效:使用Keep-Alive还是应用心跳来检测?
13 | 小数据包应对之策:理解TCP协议中的动态数据传输
14丨UDP也可以是“已连接”?
15 | 怎么老是出现“地址已经被使用”?
16 | 如何理解TCP的“流”?
17 | TCP并不总是“可靠”的?
18 | 防人之心不可无:检查数据的有效性
19丨提高篇答疑:如何理解TCP四次挥手?
期中复习周 (2讲)
期中大作业丨动手编写一个自己的程序吧!
免费
期中大作业丨题目以及解答剖析
免费
第三模块:性能篇 (12讲)
20 | 大名⿍⿍的select:看我如何同时感知多个I/O事件
21 | poll:另一种I/O多路复用
22 | 非阻塞I/O:提升性能的加速器
23 | Linux利器:epoll的前世今生
24 | C10K问题:高并发模型设计
25 | 使用阻塞I/O和进程模型:最传统的方式
26 | 使用阻塞I/O和线程模型:换一种轻量的方式
27 | I/O多路复用遇上线程:使用poll单线程处理所有I/O事件
28 | I/O多路复用进阶:子线程使用poll处理连接I/O事件
29 | 渐入佳境:使用epoll和多线程模型
30 | 真正的大杀器:异步I/O探索
31丨性能篇答疑:epoll源码深度剖析
第四模块:实战篇 (4讲)
32 | 自己动手写高性能HTTP服务器(一):设计和思路
33 | 自己动手写高性能HTTP服务器(二):I/O模型和多线程模型实现
34 | 自己动手写高性能HTTP服务器(三):TCP字节流处理和HTTP协议实现
35 | 答疑:编写高性能网络编程框架时,都需要注意哪些问题?
结束语 (1讲)
结束语丨我相信这不是结束,让我们江湖再见
网络编程实战
登录|注册

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

盛延敏 2019-08-05
你好,我是盛延敏。上一讲我们学习了 TCP/IP 的创建和历史,以及 Linux 操作系统的建立和发展,相信你对网络编程这棵大树已经有了一个宏观上的认识,那么今天我们再往前走几步,近距离看看这棵大树的细枝末节到底是怎样的。
从哪里开始呢?从网络编程的基本概念开始说起吧。

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

在谈论网络编程时,我们首先需要建立一个概念,也就是我们今天的主题“客户端 - 服务器”。
拿我们常用的网络购物来说,我们在手机上的每次操作,都是作为客户端向服务器发送请求,并收到响应的例子。
这个过程具体阐释如下:
当一个客户端需要服务时,比如网络购物下单,它会向服务器端发送一个请求。注意,这个请求是按照双方约定的格式来发送的,以便保证服务器端是可以理解的;
服务器端收到这个请求后,会根据双方约定的格式解释它,并且以合适的方式进行操作,比如调用数据库操作来创建一个购物单;
服务器端完成处理请求之后,会给客户端发送一个响应,比如向客户端发送购物单的实际付款额,然后等待客户端的下一步操作;
客户端收到响应并进行处理,比如在手机终端上显示该购物单的实际付款额,并且让用户选择付款方式。
在网络编程中,具体到客户端 - 服务器模型时,我们经常会考虑是使用 TCP 还是 UDP,其实它们二者的区别也很简单:TCP 中连接是谁发起的,在 UDP 中报文是谁发送的。在 TCP 通信中,建立连接是一个非常重要的环节。区别出客户端和服务器,本质上是因为二者编程模型是不同的。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《网络编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(50)

  • a、 置顶
    1.172.16.0.0~172.31.255.255,因为b类网络的host只占最后两个字节,172.16~172.31就代表了16个连续的b类网络可用
    2.192.168.0.0~192.168.255.255,因为c类网络的host只占最后一个字节,所以从192.168.0到192.168.255,就有256个连续的c类网络可用
    3.服务器可以监听的端口有从0到65535,理论上这台服务器的这个端口只要没被占用,你都可以给服务器绑定。
    4.如果是一些默认的服务,服务器绑的也是默认的端口,那么客户端是可以知道的。比如:80是给http服务,443是给https服务,21是给ftp服务等。否则的话,就需要服务器开发者告诉客户端应该连接哪个端口

    作者回复: 给你点赞

    2019-08-05
    2
    66
  • 剑衣清风 置顶
    172.16.0.0/12 中得出信息,172.16.0.0 为 B 类网,12 为网络号,默认 B 类网的网络号是 2*8=16 位,而此处为 12 位,那么便有 2^(16-12) = 16 个连续子网
    相应的 192.168.0.0/16 ,192.168.0.0 为 C 类网,16 为网络号,默认 C 类网的网络号是 3*8=24 位,而此处为 16 位,那么便有 2^(24-16) = 256 个连续的子网


    大家可以看看 趣谈网络协议,里面有介绍,另外 https://blog.csdn.net/molaifeng/article/details/88109717 为我结合所学及网络参考所成的博文,可以参考下

    作者回复: 总结的不错,这个部分还是蛮重要的

    2019-08-05
    2
    12
  • 莫珣 置顶
    172.16.0.0/12,首先172表明这是这个B类网络,12表示子网掩码从左往右有12个1,可以得出网络地址是172.16,但B类网络的网络地址一共有16位,所有还有4位是可以0和1任意组合的,所以总得意思就是说在172.16这个网络地址下面你还可以划分出15个局域网,那么加上172.16自己,刚好就是16个连续的B段网络。192.168.0.0/16的理解过程和172.16.0.0/12是一样的。

             端口选择,服务端端口是用一个unsigned short来表示的,理论上服务端选择端口只要在这个短整型的表示范围内即可。知名服务端软件的默认端口本身是一种建议而非规范,但是因为它们太有名了,慢慢的就变成了一种约定俗成的东西。如果你在部署的时候给改变了这个默认端口,那么你就需要告诉客户端你部署时使用的端口是什么。

            如果是你自己开发的服务端,那么端口号尽可能的不要与这些知名软件的端口冲突。当然你是不可能记住每一个软件的端口,所以你必须在你的文档中说明你所选择的默认端口是什么。并且你还需要将监听端口设计为可配置的,以便在端口冲突时为你的客户提供一个简单易行的解决方案。

    作者回复: 总结的很棒

    2019-08-05
    8
  • Skrpy 置顶
    “网络地址位数由子网掩码(Netmask)决定,你可以将 IP 地址与子网掩码进行“位与”操作,就能得到网络的值。”

    老师这句话体现了子网掩码有什么用

    “128 ~ 191.某.某.某” 属于 B 类网络;“192 ~ 223.某.某.某” 属于 C 类网络。(这里老师可以把 A、B、C 类网的网段区间说明一下)

    (一)172.16.0.0/12:
    172.16.0.0 和 1111 1111.1111 0000.0.0(12个连续的 1 的子网掩码,也称 CIDR 地址掩码) 进行“与”操作后,得到网络地址的值:172.0.0.0;B 类网络中,网络号从左到右占 16 位,即 172.16(172.0000 1111)为网络号,故从 172.0000 1111 ~ 172.1111 1111 共有16个连续的 B 段网。

    (二)192.168.0.0/16:
    192.168.0.0 和 1111 1111.1111 1111.0.0(16个连续的 1 的子网掩码)进行“与”操作后,得到网络地址的值:192.168.0.0;C 类网络中,网络号从左到右占 24 位,即 192.168.0(192.168.0000 0000)为网络号,故从 192.168.0000 0000 ~ 192.168.1111 1111 共有 256 个连续的 C 段网。

    作者回复: 非常棒的建议和总结。子网掩码定义了一个网络段共同的部分,这个是我的理解

    2019-08-05
    1
  • 啦啦的小猪
    讲的很好啊,期待下来的课程

    作者回复: 谢谢,会慢慢进入高潮部分的

    2019-08-05
    4
  • EtanYu
    无论是原先子网划分还是 CIDR 表示法都应该有 2 个保留地址,全是 0 的网关地址和全是 1 的广播地址,那个 4 个 host 是不是应该只有 2 个

    作者回复: 按照道理说,是这样的

    2019-08-08
    1
  • 错过了过去
    ”Stream sockets 是可靠的,双向连接的通讯串流。⽐如以“1-2-3”的顺序将字节流输出到套接字
    上,它们在另⼀端⼀定会以“1-2-3”的顺序抵达,⽽且不会出错。“
    这里还是要分层的吧,在应用层可以说是顺序到达的,那是因为传输层干了活,但是传输层收到包就不一定是顺序到达的了。

    作者回复: 是这样的,因为TCP就是传输层协议,就是它帮我们做到顺序的

    2019-08-05
    1
  • godtrue
    老师,IP是自包含区域信息的嘛?比如:中国有台电脑,美国有台电脑,他们都接入互联网有自己唯一的IP,当他们需要通信的时候,寻找彼此,是直接就知道寻找的方向了吧!而不是全世界都找一遍,这个是不是就是路由信息?另外,每个路由器的路由信息是都包括世界上所有的嘛?TCP的长链接是怎么维护的,还是刚才的例子中国的一台机器和美国的一台机器,他们中间隔了许多的网络设备和很远的距离,他们第一次通信和第二次通信,走的路很难想象是一样,距离太远变数太大了,不过我也很难想象他们之间的长链接是怎么维护的,好像有了一条专用通信线路,实际不可能,它怎么实现的?

    作者回复: 这些是计算机网络的基础知识,简单的说,这个是通过路由器、交换机,以及IP地址和DNS等一系列网络配套设备和协议一起完成的。建议你找一本计算机网络的书看一下。所谓长链接,并不是一条真正的物理链接,只是从软件实现角度来说,维护了这条通信的一条"逻辑"链路。

    2019-11-19
    1
  • Eleven
    老师,我们看到保留地址中第二行 172.16.0.0/12 描述为 16 个连续的 B 段,第三行 192.168.0.0/16 描述为 256 个连续的 C 段地址,怎么理解这种描述呢? 这个/12和/16是CIDR(Classes Inter-Domain Routing)表示法吧,表示网络号是多少位

    作者回复: /12, /16表示可以使用的网络IP位。例如/16表示为2的16次方个可能的IP,值应该是65536个可选的IP地址。

    2019-11-13
  • Eleven
    根据开发经验来看,如果是外部访问端口,一般都是固定的,例如https为443,http为80,如果内部服务间的通讯端口,就是大家事先约定好的,是多少无所谓了,一般是10000以上,防止占用常见端口。
    2019-11-13
  • 大雄逸豪
    解释一下为啥组播要用UDP不用TCP会更好

    作者回复: 很简单,不需要建立那么多点对点的连接,频繁的建立连接是需要成本的,而组播的好处,就是可以随时加入,随时撤离,比如你看一个球赛,一会换一个频道,这对于服务端来说,处理起来方便多了。

    2019-10-22
  • 大雄逸豪
    保留网段很多呀,何止你说的这三种,可以做局域网地址的都不止三种,比如:100.64.0.0/10

    作者回复: 我说的保留网段是划分出来的,不会用在公网IP的网段,我们一般都用保留网段来设计局域网地址,你说的这种情况比较少见。

    2019-10-22
    1
  • 我也曾是少年
    老师,请教个问题,多线程对同一个socket进行并发写,在高并发的情况下会出现什么问题呢?

    作者回复: 这个问题的前提是你怎么知道现在这个socket可以被写入,这就需要通过事件分发知道socket的事件,如果可写了,我就往这个socket里写。如果感知socket这个事情在多个线程来做,就会引起事件的"脑裂",因为你不知道什么时候这个事件是真正有效的,有可能一个线程感知时,另外一个线程已经把这个事件给处理掉了。

    所以,单独说多个线程往一个socket里并发写,并不是推荐的方式。如果把一个大文件分成很多小文件,通过多个连接(套接字)来做,这是另外一个话题了。

    2019-10-13
    1
  • 码农Kevin亮
    请教一下老师,以C类保留网段为例,同一子网下的两主机通信,与不同子网下的两主机通信,它们有何差异之处呢

    作者回复: 一个需要通过核心路由,一个不需要通过,同一个子网下的通信效率要高很多

    2019-09-01
  • 码农Kevin亮
    请教老师,能否补充一下在什么情况下会用到A类与B类的保留网段?因为平常常见的都只有C类保留网段

    作者回复: 大型组织内部进行网络划分的时候,很有可能是通过A类或者B类网段来进行规划的。像现在在云上进行VPC划分时,也都会使用A或B类网段来进行内部VPC网段的规划。

    2019-09-01
  • 我觉得老师对保留网段和子网掩码那部分讲得太晦涩了。本来看之前我还有点懂,看完之后反而不太懂了。这部分缺乏一个比较通俗的例子来说明,而且只字未提网关。平时配置局域网的时候ip,肯定会遇到网关。我看到评论里也有人说这部分看不明白。

    作者回复: 网关是一个转发设备,跟我这里的网段和子网掩码其实关系不大,不过实际是把类似192.168.1.1和10.10.101.1这样的ip当做网关使用的。

    也许我应该把网关内容加进去的,嗯。

    2019-08-29
    1
  • 朱雯
    关于a类,b类,c类这种地址,看了很多遍,但是从来没记住过。。。

    作者回复: 你只需要记住一个比一个短.....

    2019-08-16
  • 朱雯
    这个a类,b类,c类,私网公网这个内容我死活没看懂,答案也看了好几遍,也没看懂。。。最后一个问题是,一般来说一般的服务都是约定俗成的端口号,如果不是,那么必然要告诉开发者端口是多少。。
    2019-08-16
  • 朱雯
    1:服务端和客户端通信以后存在一个问题 那就是客户端要等服务端完成以后才能完成运行 那岂不是效率很低 能不能在请求发送过去之前就对客户端可能发生的一些结果进行预测 然后进行运行 第二:要是服务端迟迟不响应 客户端会咋办....

    作者回复: 淘宝的一切服务起到运行后,咱们才能上来剁手不是?客户端会超时的。

    2019-08-16
  • Suiyek
    准确来讲 端口号是一个 16 位的无符号整数,最多为 65535
    2019-08-16
收起评论
50
返回
顶部