网络编程实践
文章平均质量分 61
学习陈硕老师的《网络编程实践》课程笔记
我叫RT
无它,唯手熟耳。
心之所向,莫向外求。
展开
-
【网络编程实践--陈硕】2.4.4 procmon 程序的设计实现
procmon 设计思想要如何实现这样一个 procmon 程序。从框架的设计上我们可以采用(主动式监控的)侵入式设计,也可以使用(被动式监控的)非侵入式设计,同时针对web页面中的绘图功能也有多种解决方案。侵入式 or 非 侵入式:(Intrusive or non-intrusive)侵入式:将程序做成一个库,被监控程序主动使用该库暴露其内部状态。优点:可以暴露其内部数据,例如运行期间收到多少次请求、成功/失败次数、响应情况、延迟等。因为侵入式监控程序,和被监控的程序在同一个地址空间中,原创 2021-12-01 21:33:19 · 1024 阅读 · 0 评论 -
【网络编程实践--陈硕】2.4.3 使用procmon观察dummyload
dummyload 是一个cpu负载生成器,能够把cpu负载维持在指定的水平。下面利用dummyload工具将cpu负载按照时间余弦函数曲线变化,并使用procmon程序观察。启动dummyloaddummyload c 80 2 # c: [fctsz]-> 曲线函数类型——余弦函数# 80:[percent]-> 最高负载——80%# 2: [num_thread]-> 线程数——2个线程可以看到,进程号为 23324使用procmon监控23324进程打原创 2021-12-01 15:30:29 · 1204 阅读 · 0 评论 -
【网络编程实践--陈硕】学习笔记 | 汇总目录
本文参考《网络编程实践》–陈硕(Muduo作者)视频课程所写。基于课程内容所做归纳和整理。哔哩哔哩:https://www.bilibili.com/video/BV1LN411d7Jp这里写自定义目录标题一、网络编概要1.1 网络分层(Layered NetworK)1.2 新手的常见陷阱(Common pitfalls of novices)1.3 一个简单的TCP实验1.3.1 测量用netcat在千兆以太网的TCP吞吐量1.3.2 本地测试:从 atmo 发送到 atom1.3.3 dd 命令原创 2021-12-01 00:00:14 · 3445 阅读 · 3 评论 -
【网络编程实践】2.4.2 muduo库安装与 procmon 编译
procmon 源码在 muduo 库下,下面我们通过安装muduo库,编译procmon 源码。2.4.2.1 安装依赖1. muduo采用CMake为build system,安装方法如下:安装cmake: sudo apt-get install cmake2. muduo依赖于Boost,也很容易安装:安装boost库 sudo apt-get install libboost-dev libboost-test-devmuduo有三个非必需的依赖库:curl、c-ares DNS、G原创 2021-11-30 23:15:24 · 1080 阅读 · 0 评论 -
2.3.7 非阻塞IO中需要关注的问题
因为,chargen 程序只发送数据而不读取,如果使用 nc 时有标准输入,即 nc 会向 chargen 发送数据,最终导致 chargen 的接收缓冲区满,而 nc 无法在发送数据。因此,nc 的实现方式就显得尤为重要了。如果 nc 这边是网络读写没有分离开,那么由于对端缓冲区满将会导致本端写动作阻塞,进而阻塞整个程序。示例一:使用系统 nc 与 chargen 测试。可以看到,nc 单向接收时,吞吐量可以达到 1300MiB/s ,而 nc 端有输入时,引起了阻塞。使用 strace 调试一下原创 2021-11-30 20:06:36 · 269 阅读 · 0 评论 -
【网络编程实践】2.3.6 测试 netcat 性能
这里提供三种netcat的实现:recipes/tpc/netcat.cc thread-per-connectionrecipes/python/netcat.py IO-multiplexingrecipes/python/netcat-nonblock.py IO-multiplexing以下将以截图形式,展示测试结果。其中左上为 top 命令显示的各程序的资源占用情况,左下为执行的 netcat 程序,右为执行的 chargen 测试程序。测试系统自带的 netcat 性能.原创 2021-11-30 16:33:24 · 349 阅读 · 0 评论 -
【网络编程实践】1.2 网络编程注意事项
应尽量避免将网络编程与业务逻辑穿插在一起。注意TCP连接断开的时机与条件。因此,在应用层设计时,应考虑到TCP断开时的设计。(注:close太早可能会导致协议栈发生RST分解,连接重置,导致数据接收不完整。 在阻塞IO中可以使用SO_LINGER选项,但在非阻塞IO中此选项无用)参考:《Windows网络编程 5.6.4顺序释放连接》在服务器应用程序读取剩余数据之前,服务器主机的崩溃导致数据丢失,但客户并不知道。对于面向连接的流式套接字而言,在调用closesocket()时,选项SO_L..原创 2021-11-29 15:27:30 · 1126 阅读 · 0 评论 -
【网络编程实践】1.3.1 测量用netcat在千兆以太网的TCP吞吐量
下面我们使用 netcat 来测试一下在千兆网中 tcp 可以达到的吞吐量。在 atom 机器 发送到 e6400 机器:e6400: 在5001端口监听,收数据。atom:从 /dev/sero 读一千兆数据,发送到5001端口(注:/dev/zero文件代表一个永远输出 0的设备文件,使用它作输入可以得到全为空的文件。因此可用来创建新文件和以覆盖的方式清除旧文件)扩展:命令学习dd命令:- 用于读取、转换并输出数据。- 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到原创 2021-11-29 15:20:31 · 2113 阅读 · 0 评论 -
【网络编程实践】1.3.2 CPU占用率对网络传输的影响
注意到1.3.2 中三次测量结果:1:从内存中读取数据,580MB/s2:从磁盘中读取数据,115.720MB/s (磁盘性测量结果)3:从内存中读取数据,1074.876MB/s可以看到,1 与 3 的测试结果差异很大。原因是 1 在测试时使用 dd 命令也有一定的资源消耗,下面我们测试 ddatom发送端:使用 dd + nc 测试atom接收端:使用 nc + pv 测试可以看到此次测试结果约为 455MB/s , 弱于1.3.2第 3 次测试的1074.876MB/s。原因原创 2021-11-29 15:09:30 · 1538 阅读 · 0 评论 -
【网络编程实践】2.1.2 实现 ttcp 程序
使用 ttcp 作为例子的理由使用了基本的sockets APIs:socket,listen, bind, accept,connect,read/recv,write/send,shutdown,close 等等协议带有格式,不只是字节流,相较于echo具有tcp分包处理等ttcp 本身是由 tcp/ip 实现的程序,具有一些典型的行为。可以阅读其代码学习它的一些优秀实现协议简单,可以由多种语言实现,针对测试结果对比个语言实现的runtime开销无并发连接,client与server之间只有原创 2021-11-29 00:53:03 · 1678 阅读 · 0 评论 -
【网络编程实践】2.1.3 阻塞IO下的 echo实验
下面使用 echo.cc、echo_client.cc 演示一个阻塞IO实验。recipes/tpc/echo.ccrecipes/tpc/echo_client.cc实验在发送 20M 数据时,程序发生了阻塞。在执行 netstat 命令后可以看到它们各自的收发队列的情况.。其主要原因在于:当接收端(echo服务端)不接收数据,或者处理速率比发送方的发送速率低导致其接收缓冲区已满(接收窗口win=0),进而导致数据发送方的发送缓冲区的数据不断堆积进而缓冲区满,此时调用send()将阻塞等待原创 2021-11-29 00:46:03 · 554 阅读 · 0 评论 -
【网络编程实践】2.1.4 tcp 自连接
如果本地tcp程序本地通信,且客户端先于服务端启动,那么有极大可能会产生一种自连接现象。tcp自连接:tcp连接两段使用了同一端口进行连接,而tcp并没有报错并且连接成功。即localhost:x --> localhost:x 。而产生这种现象的原因源自于tcp内部的一种特性,而处理自连接的方法也很简单。下面使用一个示例来复现这种自连接的情况。代码:recipes/python/self-connect.py#!/usr/bin/pythonimport errnoimport soc原创 2021-11-29 00:41:46 · 1802 阅读 · 0 评论 -
【网络编程实践】2.2.1 网络时间同步(NTP)原理
Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。NTP的目的是在无序的Internet环境中提供精确和健壮的时间服务。引用: NTP的工作原理以及工作模式系统时钟同步的工作过程如下(参考图左):Device A发送一个NTP报文给Device B,该报文带有它离开Dev原创 2021-11-29 00:25:24 · 1520 阅读 · 0 评论 -
【网络编程实践】2.2.1 网络时间同步(NTP)
etwork Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。NTP的目的是在无序的Internet环境中提供精确和健壮的时间服务。引用: NTP的工作原理以及工作模式系统时钟同步的工作过程如下(参考图左):Device A发送一个NTP报文给Device B,该报文带有它离开De.原创 2021-11-29 00:21:30 · 434 阅读 · 0 评论 -
【网络编程实践】2.2.2 UDP编程,roundtrip 测量RTT时延
我们仿照NTP时间同步的原理,实现一个测量两台机器之间误差的程序,在实现中服务端将收到数据的时间与发送应答的时间抽象为一个时间点,即忽略server端处理数据的机器误差。tips:clockdiff 命令可以测量本机与目标主机的时间差,例如 clockdiff -o ntp.ntsc.ac.cn 测量本机与上海交通大学网络中心NTP服务器时间的时间差代码位置:UDP, two threadsrecipes/tpc/roundtrip_udp.ccUDP with muduo, single t原创 2021-11-29 00:05:11 · 1733 阅读 · 0 评论 -
【网络编程实践】2.2.3 测试两台服务器之间的时延
冒烟测试(基本功能测试):同一台机器,误差应该很小(单位数微秒以内,在0左右浮动)两台机器,AB之间的测试结果 与 BA之间的测试结果,应该相同(误差互为相反数),参考下图:考虑两台机器都没有NTP(不会自动校正时间),则两个机器之间的误差应成线性增长。两个机器的时钟,一个快一个慢,在不校准各自时钟的前提下,快时钟机器每秒走的秒数比慢时钟多,则测量的时间误差会一直增加,也可能先减小后增加(快时钟机器初始时间比慢时钟初始时间早)。一台机器有NTP,另一个机器无NTP,观察误差随时间变化的曲线.原创 2021-11-29 00:00:53 · 1021 阅读 · 0 评论 -
【网络编程实践】2.2.4 UDP vs. TCP
TCP:传输控制协议。面向连接的、可靠的、基于字节流的传输层通信协议。特点:可靠传输(应答确认)、提供拥塞控制、全双工通信(允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据)。UDP:用户数据报协议。无连接的、 不可靠的、 面向数据报的协议。特点:提供单播,多播,广播的功能UDP的使用场景(一般情况下尽量使用TCP协议):资源受限的情况下:例如 nat穿透技术。在互联网技术中,UDP常用在缓存读取,保存;用在监控或终端上报。不在乎可靠性:例.原创 2021-11-28 23:49:30 · 453 阅读 · 0 评论 -
【网络编程实践】2.3.2 TCP连接错误关闭示例
send()/write() 成功返回只意味着内核接收了数据,并准备在某些时候发送它们。内核接收数据后,还要把数据包发送到网卡,并在网络中各个网卡遍历,最终到达远程主机。远程主机的内核确认到数据,拥有该 socket 的进程从中读取数据,此时数据才真正到达应用程序。也就是说,当最后一次 send 函数执行完之后,并不意味着对方已经接收到完整的数据了,如果此时我们需要关闭连接,应再确认一下对方是否已经将数据接收完毕。如果贸然的使用 close 关闭连接,可能会使得数据接收不完整。示例:sender 程.原创 2021-11-28 23:20:56 · 684 阅读 · 0 评论 -
【网络编程实践】2.3.4.1 应忽略SIGPIPE信号
如果向一个已经关掉的管道写数据,write系统调用会返回一个 SIGPIPE 信号.示例:对于读写IO,当我们使用管道连接一行命令时,如果管道末端的命令执行失败,那么整个管道的程序将会依次收到SIGPIPE。避免了无效的计算。gunzip -c message.log.gz | grep -a Succeeded. | head -10# gunzip -c或--stdout或--to-stdout 把解压后的文件输出到标准输出设备# grep -a grep如果碰到\000 NUL字符,就会认原创 2021-11-28 22:51:22 · 547 阅读 · 0 评论 -
【网络编程实践】2.3.4.2 建议关闭 Nagle 算法
Nagle算法主要是避免发送小的数据包,要求TCP连接上最多只能有一个未被确认的小分组,在该分组的确认到达之前不能发送其他的小分组。Nagle算法的目的:避免发送大量的小包,网络上每次只能一个小包存在,在小包被确认之前,只能积累发送大包,如果包长度达到MSS,则允许发送;如果该包含有FIN,则允许发送;但发生了超时(一般为200ms),则立即发送, 启动TCP_NODELAY,就意味着禁用了Nagle算法Nagle算法会严重影响请求响应式协议的延迟。如果我们的程序设计的不够合理,Nagle算法可能会增原创 2021-11-28 22:13:51 · 2946 阅读 · 0 评论 -
【网络编程实践】2.3.4.3 使用SO_REUSEADDR选项
SO_REUSEADDR ——复用地址 。一般服务器的监听socket都应该打开它。它允许服务器bind一个地址,即使这个地址当前已经存在已建立的连接。对于以下两种情况,SO_REUSEADDR会很有作用:(图片取自网络,侵权删除)服务器启动后,与客户端建立连接,如果服务器主动关闭,那么和客户端的连接会处于TIME_WAIT状态,此将无法启动服务器进程。服务器父进程监听客户端,建立连接后,fork一个子进程专门处理客户端的请求,如果父进程停止,因为子进程还和客户端有连接,所以此时重启父进程会失败原创 2021-11-28 22:04:36 · 671 阅读 · 0 评论 -
【网络编程实践】2.3.5.2 基于多线程阻塞IO实现的 netcat
Thread-per-connection 适用于连接数目不太多,或者线程非常廉价的情况。使用多线程的方式来实现 netcat, 一个连接需要对应两个线程去处理,每个线程负责连接上的一个方向,即读 或 写。下面程序中,主线程负责 从标准输入,写到 TCP Socket,另一个线程负责 从 TCP Socket 读, 写到标准输出。// recipes/tpc/netcat.cc 部分代码void run(TcpStreamPtr stream){ // Caution: a bad ex原创 2021-11-28 21:44:52 · 311 阅读 · 0 评论 -
【网络编程实践】2.3.5.3 基于 IO 复用(阻塞IO)实现的 netcat
IO 复用(事件驱动)使得一个线程可以处理多个连接上的请求,值得注意的是,无论是基于 阻塞IO 还是 非阻塞IO ,他们都是同步而非异步。IO复用一般和非阻塞的IO一起使用。因为使用阻塞IO的话可能会存在阻塞程序的风险。例如下面这个例子是 IO复用+阻塞IO 实现的netcat.py ,它在某些情况下会阻塞程序。#!/usr/bin/pythonimport osimport selectimport socketimport sysdef relay(sock): poll =原创 2021-11-28 21:34:03 · 92 阅读 · 0 评论 -
【网络编程实践】2.3.5.4 IO复用配合阻塞IO使用,可能会阻塞整个程序
下面进行一个测试:server:chargen.cc,,只发数据不收数据client: nc, nc < /dev/zerochargen 程序只发送数据而不读取,如果使用 nc 时有标准输入,即 nc 会向 chargen 发送数据,将最终导致 chargen 的接收缓冲区被填满,而 nc 无法再发送数据。因此,nc 的实现方式就显得尤为重要了。如果 nc 这边是网络读写没有分离开,那么由于对端缓冲区满将会导致本端写动作阻塞,进而阻塞整个程序。示例一:使用系统 nc 与 chargen原创 2021-11-28 21:29:26 · 213 阅读 · 0 评论 -
【网络编程实践】2.3.5.5 基于IO复用(非阻塞IO)实现的 netcat
使用非阻塞IO可以有效避免上述情况的发生。但非阻塞IO在编程上要比阻塞IO更难,并且在程序的维护上比较痛苦。一般使用非阻塞IO编程时建议使用一些封装好的网络库比较容易编写。下面是python实现的基于IO复用的非阻塞IO的netcat 。#!/usr/bin/pythonimport errnoimport fcntlimport osimport selectimport socketimport sys# 设置非阻塞def setNonBlocking(fd): flags原创 2021-11-28 21:24:36 · 230 阅读 · 0 评论