网络编程实战
盛延敏
前大众点评云平台首席架构师
44207 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
网络编程实战
15
15
1.0x
00:00/00:00
登录|注册

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

发送端和接收端的过程
数据流经过的拷贝
查看RFC文档
《TCP/IP详解》
《UNIX网络编程》
《C程序设计语言》
结构体和函数
数组和指针
使用WSL进行编译运行
调试和配置参数
推荐使用
使用Clang完成编译和链接
安装Cmake和make
使用CMake编译程序
安装Cmake、make和gcc/g++
CMake
GitHub
内核和网络设备供应商的优化
性能影响
TCP/IP层次模型
书籍推荐
建议自行设置小任务
不建议一开始学习C++
C语言的精髓
推荐学习C语言
Windows
CLion
MacOS
Ubuntu系统
代码组织
疑难解答
学习路径
代码和环境
网络编程实战

该思维导图由 AI 生成,仅供参考

你好,我是盛延敏,这里是网络编程实战第 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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文是网络编程实战第9讲的答疑篇,作者盛延敏在文章中总结了学习网络编程所需的代码和环境配置,包括在Ubuntu系统和MacOS上的安装和配置步骤,以及在Windows系统上使用CLion进行编译和调试的方法。作者还提到了学习网络编程的路径建议,强调了学习C语言的重要性,并指出了C语言的精髓包括数组和指针、结构体和函数。作者建议初学者先掌握C语言的基础,然后再深入学习TCP/IP协议等理论知识。整体而言,本文为读者提供了网络编程实战的基础知识和学习路径建议,对于想要深入学习网络编程的读者具有一定的参考价值。文章还推荐了一些经典的书籍,包括《C程序设计语言》、《UNIX网络编程》和《TCP/IP详解》,为读者提供了更多深入学习的资源。同时,作者通过解答读者在学习网络编程过程中遇到的疑惑,帮助读者更好地理解TCP/IP分层的思想和数据流传输过程,为读者提供了实用的技术知识和解决问题的方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《网络编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(40)

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

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

    2019-11-30
    14
  • 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
    2
    9
  • 哈哈,看完之后还是不确定拷贝了几次,老师为啥不先给明确的结论,再解释你给结论的依据呢?😄

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

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

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

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

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

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

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

    2019-08-22
    5
  • Gougle
    [ 96%] Linking C executable ../bin/aio01 ld: library not found for -lrt clang: error: linker command failed with exit code 1 (use -v to see invocation) make[2]: *** [bin/aio01] Error 1 make[1]: *** [chap-30/CMakeFiles/aio01.dir/all] Error 2 make: *** [all] Error 2 老师MacOS编不过

    作者回复: 这个好多同学反映了,我发现都是rt这个库的问题,删掉这个库就好了,新版的Mac和Linux都不需要再显示指定这个库。 同步下代码再编译下。

    2020-03-03
    3
    3
  • Tunayoyo
    老师,中秋快乐。 请您讲讲Windows上CLion怎么运行你写的代码吧,基本流程提下,谢谢了!

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

    2019-09-13
    3
    3
  • Mosea
    [ 97%] Linking C executable ../bin/aio01 /usr/bin/ld: CMakeFiles/aio01.dir/aio01.c.o: in function `main': aio01.c:(.text+0x1e9): undefined reference to `aio_write' /usr/bin/ld: aio01.c:(.text+0x242): undefined reference to `aio_error' /usr/bin/ld: aio01.c:(.text+0x256): undefined reference to `aio_error' /usr/bin/ld: aio01.c:(.text+0x26b): undefined reference to `aio_return' /usr/bin/ld: aio01.c:(.text+0x3c8): undefined reference to `aio_read' /usr/bin/ld: aio01.c:(.text+0x418): undefined reference to `aio_error' /usr/bin/ld: aio01.c:(.text+0x42c): undefined reference to `aio_return' collect2: error: ld returned 1 exit status make[2]: *** [chap-30/CMakeFiles/aio01.dir/build.make:85: bin/aio01] Error 1 make[1]: *** [CMakeFiles/Makefile2:1917: chap-30/CMakeFiles/aio01.dir/all] Error 2 make: *** [Makefile:130: all] Error 2 老师,我的环境是Ubuntu20 cmake之后,Makefile文件已经生成,执行make的文件的时候,出现这个错误,看错误好像是链接的时候找不到相关文件,老师的GitHub仓库也有人问相关的问题。https://github.com/froghui/yolanda/issues/25 现在还没有人回答,可以问一下老师这个问题如何解决吗?

    作者回复: /chap-30/CMakeList.txt 的最后一行改为 target_link_libraries(aio01 yolanda rt), 加上rt这个动态库试试?

    2022-01-17
    2
  • Vfeelit
    一直有几个困惑,希望老师可以解惑。 TCP协议,在发送数据时会先拷贝数据到发送缓冲区,如果数据比较大,马上塞满了发送缓冲区,这个时候必须把数据发出去应用程序才能继续拷贝数据进来,困惑地方是,到达IP层后,TCP报文是否会被拆分成多个IP包? 如果不会,那么TCP报文最大只能是发送缓冲区大小? 另外,在UDP中,如果要发送的数据超过发送缓冲区,数据会被截断?

    作者回复: TCP报文会被拆分成IP报文的,这个是由协议栈帮助完成的。 有两个因素值得考虑, 第一个是缓冲区大小不是你想象那么小的,一般情况下都能容纳下应用层的信息; 第二个是应用程序往缓冲区拷贝数据,不是100%会成功,特别是在非阻塞的情况下,拷贝完之后应用程序需要配合缓冲区情况继续完成没有拷贝成功的部分,不存在数据被截断的情况。

    2019-09-28
    2
收起评论
显示
设置
留言
40
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部