网络编程实战
盛延敏
前大众点评云平台首席架构师
立即订阅
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讲)
结束语丨我相信这不是结束,让我们江湖再见
网络编程实战
登录|注册

09丨答疑篇:学习网络编程前,需要准备哪些东西?

盛延敏 2019-08-21
你好,我是盛延敏,这里是网络编程实战第 9 讲,欢迎回来。
今天是基础篇的最后一讲。在这一讲中,我将会针对基础篇中大家提出的普遍问题进行总结和答疑,让我们整理一下,再接着学习下一个模块的内容。

代码和环境

既然我希望通过学习,可以带你进行网络编程实战,那么就得有一个环境,可以运行文章中的例子,并加以活学活用。
我已经将代码上传到 GitHub 中,你可以访问以下地址来获得最新的代码。
代码按照章节组织,比如 chap-7 就对应第七篇文章。
代码按照 CMake 组织,CMake 是一个跨平台的编译管理系统,使用 CMake 可以方便地在 Linux 等类 UNIX 系统下动态生成 Makefile,再由 make 工具编译、链接生成二进制文件。当然,CMake 也可以支持 Windows 系统下的 C/C++ 编译,这里我们就不展开了。
所有的代码我都已经测试过,可以运行在 Linux 和 MacOS 上。

Ubuntu 系统

在 Linux 下,如果你是 Ubuntu 系统,需要安装 Cmake、make 和 gcc/g++ 等编译系统和工具。
sudo apt-get install gcc g++ make cmake
如果是 CentOS 或 Red Hat,需要执行 yum install 命令:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《网络编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(28)

  • ly
    哈哈,和老师灵魂碰撞了,unix的网络编程卷1和2昨天下单的。
    按照第5章的相关逻辑自己用Java写了一段demo程序。
    【Java代码逻辑】
    服务端接收 1024 字节(read)就休眠1秒钟;
    客户端for循环50次,每1次for循环写 10 * 1024 字节出去(write/flush)。
    【现象】
    服务端间隔1秒打印出接收到的1024字节数据。
    客户端发送完几乎每发送1024*10字节以后会阻塞一会,然后接着再发送1024*10字节,但是客户端发送完所有数据退出时,服务端还在不断的接收打印。
    【wireshark抓包片段】
    (56725客户端端口,8888服务端端口)
    ------------------------------------------------------------
    ......
    56725 > 8888 [ACK] Seq=1 Ack=1 Win=8192 Len=1460
    56725 > 8888 [ACK] Seq=1461 Ack=1 Win=8192 Len=1460
    8888 > 56725 [ACK] Seq=1 Ack=2921 Win=8192 Len=0
    56725 > 8888 [ACK] Seq=2921 Ack=1 Win=8192 Len=1460
    56725 > 8888 [ACK] Seq=4381 Ack=1 Win=8192 Len=1460
    56725 > 8888 [ACK] Seq=5841 Ack=1 Win=8192 Len=1460
    56725 > 8888 [ACK] Seq=7301 Ack=1 Win=8192 Len=1460
    8888 > 56725 [ACK] Seq=1 Ack=8761 Win=8192 Len=0
    ......
    ------------------------------------------------------------
    观察的期间会出现一些 TCP Window Full / TCP window Update 等标记。
    【个人理解】
    客户端之所以发送 1024*10 字节以后会阻塞,应该是发送端的速度大于了接收端的速度,TCP协议会自动对发送方限流,又或者是因为本地发送缓冲区满了,需要阻塞发送方。

    【疑问】
    1. 为什么客户端向服务端发送数据的时候,wireShark显示的是 [ACK] 应答标记,我记得之前发送比较少的数据时显示的是 [PSH+ACK]标记?
    2. TCP Window Full/TCP window Update 这些标记什么时候会出现,代表什么意思呢?
    请老师点评。。。。

    作者回复: 第一个是为了更好的利用带宽,在发送数据的同时捎带传输ACK报文,这个是和具体场景有关的,并不一定每次都会起作用。

    第二个应该是发送窗口和接收窗口的同步报文。

    2019-08-21
    1
    5
  • 传说中的成大大
    所以最终是拷贝了六次?
    2019-08-21
    4
  • Tunayoyo
    老师,中秋快乐。
    请您讲讲Windows上CLion怎么运行你写的代码吧,基本流程提下,谢谢了!

    作者回复: 哦,这个,基本上有点难哎,头文件可能都不一样,你可以在windows上装虚拟机来跑,或者用cygwin,这样的话跑CLion可能有问题。。。。

    2019-09-13
    1
    1
  • 码农Kevin亮
    平常都用JAVA,没用过Clion也没接触过CMake,下载了Clion后搞来搞去都报错,说文件路径有问题。求助

    作者回复: 把你的错误贴上来,大家一起帮你看看

    2019-09-09
    1
  • 0ver10@d
    根据最后一张图,对于接收方,是必须要等到数据存入到最上面的接收缓冲区后,操作系统才会发送ACK?还是当数据从Rx ring取出后ACK就可以发送了?或者是必须要等应用程序将数据从接收缓冲区读出后才发出?

    作者回复: 应该是最上面的TCP层,因为这是TCP层在控制ACK等报文。

    2019-08-22
    1
  • 石将从
    老师,你这个环境省略了好多东西啊,cd build && cmake -f ../
    哪里的Build目录呀

    作者回复: 当前路径mkdir build就可以了

    2019-08-21
    1
    1
  • 传说中的成大大
    那个build目录是那个路径下的啊?我感觉都是系统路径下呢

    作者回复: 当前路径mkdir build

    2019-08-21
    1
    1
  • 马仔
    我想学习Linux代码在window上的porting,但是网上的资料都比较散。老师可以推荐一些比较完整的资料吗。

    作者回复: 这个我不是专家,不过我觉得你可以试着一个一个尝试,碰到问题翻翻msdn

    2019-08-21
    1
  • HunterYuan
    最近在做网络吞吐的性能优化,涉及到网卡多队列,NAPI减少中断,软件多队列,CPU绑定不同的队列,以及socket与内核之间的交互进行共享内存的实现,应用层层采用多线程进行不同数据的处理之后。再回头看老师的讲解,对照内核协议栈源码,感觉收获颇多,感谢感谢。

    作者回复: 你做的东西挺艰深的哈,有时间可以给大家分享分享。

    2019-11-30
  • godtrue
    哈哈,看完之后还是不确定拷贝了几次,老师为啥不先给明确的结论,再解释你给结论的依据呢?😄

    作者回复: 这个本身就没有确切的答案,主要是对网络协议栈加强整体的认识就可以了。

    2019-11-23
  • supermouse
    使用 Windows 系统 + CLion 的同学,可以在 Win10 应用商店中下载一个 Ubuntu 版本的 Windows 子系统,即 WSL,然后在 CLion 中配置工程的环境为 WSL 即可编译运行。亲测可用。

    作者回复: 赞,我让编辑把这段加进去。感谢。

    2019-11-03
  • Kepler
    老师,为啥我的aio.h头文件不包含aio_read() , aio_write() 这俩函数,
    是因为内核版本太低了吗?
    Linux SH_VM_0_7_centos 4.20.11-1.el7.elrepo.x86_64 #1 SMP Wed Feb 20 09:00:53 EST 2019 x86_64 x86_64 x86_64 GNU/Linux

    作者回复: 安装一下最新的Glibc试试?

    2019-09-30
  • 小蚂蚁
    老师请教一个问题,一直做的的是windows下的开发,用的vs,linux环境下的开发也就用clion写写demo,像那种linux服务开发岗日常工作中难道都用vim开发的吗?vim写个小程序,gdb调试我倒还能理解,像那种动辄数万行,数十万代码,几百个或以上的项目难道也都不用IDE的吗?

    作者回复: 这个看个人习惯了,我见过用vim开发的,也见过用vs、clion IDE开发的,个人觉得只要释放生产力就行。

    我个人是用IDE的,vim只写一些脚本。

    2019-09-28
  • Vfeelit
    一直有几个困惑,希望老师可以解惑。

    TCP协议,在发送数据时会先拷贝数据到发送缓冲区,如果数据比较大,马上塞满了发送缓冲区,这个时候必须把数据发出去应用程序才能继续拷贝数据进来,困惑地方是,到达IP层后,TCP报文是否会被拆分成多个IP包? 如果不会,那么TCP报文最大只能是发送缓冲区大小?

    另外,在UDP中,如果要发送的数据超过发送缓冲区,数据会被截断?

    作者回复: TCP报文会被拆分成IP报文的,这个是由协议栈帮助完成的。

    有两个因素值得考虑,

    第一个是缓冲区大小不是你想象那么小的,一般情况下都能容纳下应用层的信息;

    第二个是应用程序往缓冲区拷贝数据,不是100%会成功,特别是在非阻塞的情况下,拷贝完之后应用程序需要配合缓冲区情况继续完成没有拷贝成功的部分,不存在数据被截断的情况。

    2019-09-28
  • Geek_404738
    对于那个网卡分层逻辑图,非常好。在实际工作中,怎样分析出是哪个环节的缓冲出问题呢。我是做测试,很想了解这个。

    作者回复: 抓包, troubleshooting,需要时间慢慢磨练

    2019-09-25
  • 码农Kevin亮
    麻烦老师有空看看git上的issue,编译时出错不知道怎么破

    作者回复: 已经解决了吧?是C99那个么?还是cmake版本过高?

    2019-09-22
    1
  • JasonZhi
    老师你好,请问编译源码采用的gcc、make、cmake版本有什么要求?我这边是linux系统,gcc:4.8.5,make:3.82,cmake:3.13.2。编译tcpserver是会报错:需要添加-std=c99,还有找不到常量POLLRDNORM

    作者回复: 在CMakeLists.txt里面增加c99的支持:
    set(CMAKE_C_STANDARD 99)


    POLLRDNORM是<sys/poll.h>里面定义的,你检查一下?

    2019-09-21
  • 囊子
    windows上可以用Cygwin来搭建开发环境,安装cmake,make,gcc,g++等包,虽然不可能完全模拟linux上的环境,但是大部分代码修修补补也是可以运行起来的。

    作者回复: 是的,但终归还是一个"伪"模拟环境。

    2019-09-16
  • 许路路
    好的
    2019-08-28
  • 无名
    所以总共经过了7次拷贝?
    2019-08-25
    1
收起评论
28
返回
顶部