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

08 | 工欲善其事必先利其器:学会使用各种工具

盛延敏 2019-08-19
你好,我是盛延敏,这里是网络编程实战第 8 讲,欢迎回来。
上一讲我们讲到了本地套接字,加上前面介绍的 TCP、UDP 套接字,你会发现我们已经比较全面地接触了套接字。
其实在平常使用套接字开发和测试过程中,我们总会碰到这样或那样的问题。学会对这些问题进行诊断和分析,其实需要不断地积累经验。而 Linux 平台下提供的各种网络工具,则为我们进行诊断分析提供了很好的帮助。在这一讲里,我将会选择几个重点的工具逐一介绍。

必备工具: ping

这个命令我想大家都不陌生,“ping”这个命名来自于声呐探测,在网络上用来完成对网络连通性的探测,这个命名可以说是恰如其分了。
$ ping www.sina.com.cn
PING www.sina.com.cn (202.102.94.124) 56(84) bytes of data.
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=1 ttl=63 time=8.64 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=2 ttl=63 time=11.3 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=3 ttl=63 time=8.66 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=4 ttl=63 time=13.7 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=5 ttl=63 time=8.22 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=6 ttl=63 time=7.99 ms
^C
--- www.sina.com.cn ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5006ms
rtt min/avg/max/mdev = 7.997/9.782/13.795/2.112 ms
在上面的例子中,我使用 ping 命令探测了和新浪网的网络连通性。可以看到,每次显示是按照 sequence 序列号排序显示的,一并显示的,也包括 TTL(time to live),反映了两个 IP 地址之间传输的时间。最后还显示了 ping 命令的统计信息,如最小时间、平均时间等。
我们需要经常和 Linux 下的 ping 命令打交道,那么 ping 命令的原理到底是什么呢?它是基于 TCP 还是 UDP 开发的?
都不是。
其实,ping 是基于一种叫做 ICMP 的协议开发的,ICMP 又是一种基于 IP 协议的控制协议,翻译为网际控制协议,其报文格式如下图:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《网络编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(18)

  • xindoo
    iftop命令可以查网络io大户
    2019-08-19
    16
  • 许童童
    tcpdump可以抓UDP,很简单 指定端口就可以了。

    tcpdump还可以导出文件pcap,放到wireshark中进一步分析。

    Foreign Address 显示的 *.* 表示的是什么意思呢?
    这个套接字正在监听端口等待连接进来,允许任何地址、任何端口来建立连接。
    2019-08-19
    2
    7
  • 哦哟哟哟哟
    麻烦老师解答下。前面ifconfig命令关于网卡优先级的metric=1表示优先级最高、示例中三张网卡优先级都是1、那如何进行选择呢

    作者回复: 看你应用程序绑定到哪个网卡设备和Ip了

    2019-08-19
    3
  • 一步
    对于 ping 的最后统计信息中
    rtt min/avg/max/mdev = 4.512/4.579/4.647/0.078 ms
    中的 mdev 时间是什么意思的?

    作者回复: 这个值我也没注意过,看了介绍是说mdev 就是 Mean Deviation 的缩写,它表示这些 ICMP 包的 RTT 偏离平均值的程度,这个值越大说明你的网速越不稳定。

    2019-08-20
    1
    2
  • 剑衣清风
    tcpdump 可以结合 wireshark,也就是把抓到的协议包保存成 cap 格式的,然后在 windows 上点击查看更加形象

    tcpdump host 10.1.11.133 and udp port 5060 -v -w gw.cap【写成 wireshark 可读取的】
    2019-08-19
    2
  • 明键
    IPv6的地址不是128位吗,为什么我数ifconfig的输出只有12字节?还有四字节到哪里去了呢?

    作者回复: IPV6的地址格式为X:X:X:X:X:X:X:X,一共8个X,其中每个X表示地址中的16b,以十六进制表示。

    在某些情况下,一个IPv6地址中间可能包含很长的一段0,可以把连续的一段0压缩为“::”。

    所以,看看你的地址里是不是有::哦。

    2019-11-27
  • godtrue
    小结
    ping 可以用来帮助我们进行网络连通性的探测。
    ifconfig,用来显示当前系统中的所有网络设备。
    netstat 和 lsof 可以查看活动的连接状况。
    tcpdump 可以对各种奇怪的环境进行抓包,进而帮我们了解报文,排查问题。
    iftop命令可以查网络io大户
    arp
    router
    ss
    2019-11-22
  • icejoywoo
    ss可以替代netstat么,netstat有时候非常慢,ss速度很快

    作者回复: 可以的,作为一个老程序员,ss是我刚刚接触到的,学习了。

    2019-11-02
  • 大雄逸豪
    ifconfig、netstat都是比较偏老的、不再维护的命令,为啥不与时俱进讲一下iproute2系列的命令

    作者回复: 这些命令在平时的trouleshooting还是很有用处的,毕竟还不能在生产环境都换成Linux 4/5版本吧。

    2019-10-22
  • 一天到晚游泳的鱼
    老师tcp头部偏移位13字节表示的是头部长度啊 并不是syn啊

    作者回复: 是这样的,这里的偏移是从0开始算起的,tcp[13]其实是第14个byte。我在文稿里稍微加一下。感谢指出。

    2019-09-28
  • 不二
    老师您好,可否具体讲解一下time_wait

    作者回复: 后面第10讲专门讲了time_wait,你可以看一下

    2019-09-27
  • kissingers
    老师,wireshark 是人工肉眼分析的工具,有没有自动分析网络和排查网络故障的工具?

    作者回复: 自动化的工具应该有,抓包只是入门的技巧。

    2019-09-21
  • 星辰
    老师:  seq= 1949465353 对应的 ack= 1949465354

    可是 seq= 3372444594对应的ack= 3372444595为啥没找到啊?

    00:37:31.920159 IP 192.168.31.10.49564 > 182.61.62.12.https: Flags [S], seq 1949465353, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 1065686443 ecr 0,sackOK,eol], length 0

    00:37:31.930144 IP 182.61.62.12.https > 192.168.31.10.49564: Flags [S.], seq 3372444594, ack 1949465354, win 8192, options [mss 1440,nop,wscale 5,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,sackOK,eol], length 0

    00:37:31.930188 IP 192.168.31.10.49564 > 182.61.62.12.https: Flags [.], ack 1, win 4096, length 0
    00:37:31.930913 IP 192.168.31.10.49564 > 182.61.62.12.https: Flags [P.], seq 1:518, ack 1, win 4096, length 517
    00:37:31.941981 IP 182.61.62.12.https > 192.168.31.10.49564: Flags [.], ack 518, win 812, length 0
    00:37:31.943678 IP 182.61.62.12.https > 192.168.31.10.49564: Flags [P.], seq 1:97, ack 518, win 812, length 96
    00:37:31.943704 IP 192.168.31.10.49564 > 182.61.62.12.https: Flags [.], ack 97, win 4094, length 0
    00:37:31.944626 IP 182.61.62.12.https > 192.168.31.10.49564: Flags [P.], seq 97:103, ack 518, win 812, length 6
    00:37:31.944631 IP 182.61.62.12.https > 192.168.31.10.49564: Flags [P.], seq 103:148, ack 518, win 812, length 45
    00:37:31.944657 IP 192.168.31.10.49564 > 182.61.62.12.https: Flags [.], ack 103, win 4095, length 0
    00:37:31.944666 IP 192.168.31.10.49564 > 182.61.62.12.https: Flags [.], ack 148, win 4095, length 0
    00:37:31.944784 IP 192.168.31.10.49564 > 182.61.62.12.https: Flags [P.], seq 518:569, ack 148, win 4096, length 51


    作者回复: 我已经发现很多同学有这个问题了,我不确定是不是漏报,还是其他什么原因......

    2019-08-27
  • yusuf
    老师,以下是我用tcpdump抓的三次握手,我认为第3个包中的ack应该是1551435398,可为什么第3个包中ack的值实际是1呢?

    # tcpdump -i lo host 127.0.0.1 and port 12345 -c 5
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes


    14:53:40.089777 IP localhost.49054 > localhost.italk: Flags [S], seq 2093800598, win 43690, options [mss 65495,sackOK,TS val 707848048 ecr 0,nop,wscale 6], length 0

    14:53:40.089792 IP localhost.italk > localhost.49054: Flags [S.], seq 1551435397, ack 2093800599, win 43690, options [mss 65495,sackOK,TS val 707848048 ecr 707848048,nop,wscale 6], length 0

    14:53:40.089806 IP localhost.49054 > localhost.italk: Flags [.], ack 1, win 683, options [nop,nop,TS val 707848048 ecr 707848048], length 0

    14:54:01.561276 IP localhost.49054 > localhost.italk: Flags [P.], seq 1:1025, ack 1, win 683, options [nop,nop,TS val 707869520 ecr 707848048], length 1024

    14:54:01.561355 IP localhost.italk > localhost.49054: Flags [.], ack 1025, win 715, options [nop,nop,TS val 707869520 ecr 707869520], length 0


    5 packets captured
    12 packets received by filter
    0 packets dropped by kernel

    作者回复: 我也觉得是,不知道你这个是啥系统?

    2019-08-22
    1
  • 禾桃
    “另外,netstat 输出时,监听状态的套接字所对应的 Foreign Address 显示的 *.* 表示的是什么意思呢?”

    是表示任何远端地址端口都可以和它建立连接的意思吗?

    作者回复: 可以这么理解

    2019-08-20
  • 刘明
    2、表示接受任意IP地址任意端口的连接请求。
    2019-08-19
  • 刘明
    1、tcpdump -i eth0 -nn -XX udp and src port 1234
    2019-08-19
  • 二星球
    老师好,向您请教最近遇到的一个问题,APP应用通过http长链接向后台发送请求,中间有几个代理服务器,偶尔发现app发送的请求返回的状态码是正常的200,但是没有返回值,没有出错,后台也没有收到请求,这是什么原因,该如何解决呢?

    作者回复: 我觉得既然都收到http 200的结果,那么应该是应用层出错了吧。

    2019-08-19
收起评论
18
返回
顶部