一大波 Linux 学习笔记来啦
楼主是去年参加的校招,已经拿到 offer(baidu) 啦,现在分享一波学习笔记,希望能帮到做 C/C++/Linux 后台的同学,当然其他方向的同学有兴趣,也可以学习下啦!
希望同学们点进去后,最好能关注一下……^_^
偷偷告诉你,群里有萌妹子 Linus 等你来调戏哦!
相关资源
一、保护模式
http://blog.csdn.net/column/details/15102.html
操作系统基本内功,是 Linux 内核学习的基础
二、多线程切换原理及其手工实现
http://blog.csdn.net/column/details/15084.html
让你在不掌握内核的情况下,快速学习到线程到底是怎么实现的。这一系列笔记教你从 0 到 1 写出一个用户级线程框架。
三、Unix/Linux 环境编程
博客专栏:http://blog.csdn.net/column/details/15043.html
文章目录:http://blog.csdn.net/q1007729991/article/details/52770103
耗时 7 个月完成的笔记,呕心沥血啊!每一篇都花了很大心血。
四、Unix/Linux 网络编程(正在更新)
博客专栏:http://blog.csdn.net/column/details/15153.html
文章目录:http://blog.csdn.net/q1007729991/article/details/69091877
学习网络编程的必备知识,现在正在更新 TCP 部分。
滑动窗口协议
在上一文中我们已经介绍了滑动窗口的基本概念,以及它的目的。本文我们就亲自动手实践一下。
1. 环境准备
Git 地址:https://git.oschina.net/ivan_allen/unp.git
- 服务器:unp/protocol/tools/tcpserver/sink_serv.c,部署在 Linux 上。
- 客户端:/home/allen/unp/protocol/tools/winclient/sink_client.cpp,部署在 Windows 上。
服务器之所以叫 sink_serv,是因为它就是个黑洞,它接收到数据后就直接扔了,即石沉大海了(实际上,代码中将接收到的数据打印在屏幕上了)。服务器每隔 500 毫秒从接收缓冲区读一次数据,一次最多读 1024 字节。
客户端每次向服务器发送 1024 字节的数据,本质上是向自己的发送缓冲区写入 1024 字节数据。连续发送 count 次,count 可以通过命令行参数指定。
2. 实验
- 启动服务器
图1 服务器启动
从图 1 中我们看到服务器最后一个启动参数是 4096,它表示将接收缓冲区大小设置为 4096. 然而,内核在设置缓冲区大小的时候,会把缓冲区大小设置为这个值的 2 倍(具体原因请参考 man 手册),因此可以看到第 4 行打印 actual recvbufsize:8192.
- 在 windows 上打开 OmniPeek 准备抓包,同时启动客户端
sink_client.exe 192.168.80.129 8000 8
参数 8 表示客户端连续发送 8 次数据,每次 1024 字节。
3. 抓包结果
图2 OmniPeek 抓包结果
图3 时序图
在时序图中,ACK n 表示对序号为 n 的 TCP 段进行确认。
图4 滑动窗口分析
图 4 中,我们用绿色表示发送方,蓝色表示接收方加送的信号。在一开始的时候,接收方通告了一个大小为 2920 大小的窗口,接下来发送方发送了 4 号报文,大小为 1024 B,然后接收方确认了 4 号报文,并通告了一个大小为 2920 大小的窗口。后面依此类推。
4. 总结
- 掌握滑动窗口的工作原理
#百度##C++工程师#最后再次强调一下,学习滑动窗口,我们假设网络是理想的,不拥塞,只要发了数据,对方一定能收到。