说在前面
本周是五一假期周,但是实验的进度并不停滞。
学生需自行预约时间完成传输层的实验内容。
实验本身的操作难度约等于0,而理论分析的含量非常高。
TCP在理论课中已占了较大的篇幅,因此本次博客不强调理论知识,
着重讲解linux线上平台的使用。
上篇博客我们使用的是与机房环境更加相似的Winxp系统,
这次TCP实验则需要我们使用Linux系统进行操作。
还是老样子,我把需要注意的细节先放在最前面:
-
在第一次博客中便提到这个链接: 网络实验常见问题解答
它应该能解决你绝大多数的问题,例如登录账号密码,如何连接中间设备,如何配置主机IP,如何修改sequence号为具体数值等等。
下面我就讲文档里没有的内容。
-
PC与中间设备的对应关系和之前是一样的。虽然这次桌面上没有快捷方式,但是在终端minicom之后对应的中间设备仍然是唯一确定的。
PCA:S1、PCB:S2、PCC:R1、PCD:R2
你问我怎么知道的? dis cu 再结合实验验证即可确定。
-
PCB一般来说有Eth0和Eth1两个网络,请一定注意配置IP地址时,连接的是你组网的那个端口。
-
linux的窗口关闭/最大化/最小化位于左上角。
-
linux好像不支持双击。打开文件夹都得右键Open。
-
无意间探索到的一些快捷键:(超级终端均可使用)
ctrl+L = dis ip r,可以快速查看路由表信息
ctrl+G = dis cu,可以快速查看当前设备的配置
实验部分
正如前文所说,本次实验组网很简单,而难点在于分析。
首先提醒大家TCP的三个实验前需要记录一下发送方初始序号,实验报告要填。
TCP实验主要考察了:连接控制、流量控制、拥塞控制。
连接控制
其实就是三次握手和四次挥手。
这是理论课的重点,这里就简单概括几条:
- 建立连接是SYN,结束连接是FIN。
- 建立连接时,报文的TCP Header会有Option来约定MSS以及是否SACK等内容。
- 建立:Client发出SYN请求,Server回应请求并发出SYN请求,Client回应请求。
- 结束:Client发出FIN请求,Server回应请求(此时还可以发数据),Server发出FIN请求,Client回应请求。
滑动窗口
需要注意拥塞窗口常常写成以报文数为单位,而发送窗口与接收窗口以字节数为单位,中间有1460的倍数关系。
下面解释几个名词。
rcv_wnd:接收窗口的大小,来自于ACK报文的TCP Header信息。
snd_wnd_left:发送窗口的最左侧,也即已发出且尚未确认的最早字节号。
snd_wnd_pointer:当前正在发送的字节号。
snd_wnd_point-left:已发出且尚未确认的字节数。
snd_wnd_left+cwnd:拥塞窗口限制下的发送窗口右边缘。
snd_wnd_left+rcv_wnd:接收窗口限制下的发送窗口右边缘。
发送窗口右边沿:上面两行中的最小者作为真正的发送窗口右边缘。
通告的接收窗口:ACK报文视角下的rcv_wnd。
接收窗口左边沿:当前已接收未确认的最早字节号,数值等同于对应字节的snd_wnd_left。
接收窗口指针:当前正在接受的字节号,数值等同于对应字节的snd_wnd_pointer。
接收窗口右边沿:数值等同于对应字节的snd_wnd_left+rcv_wnd。
在接收缓存中的数据量(即未确认的数据):数值等同于对应字节的snd_wnd_point-left。
具体知识见理论。这是理论重点。
关注零窗口报文Zero-Window及其探测报文Keep-Alive。
注意理论课讲的保活计时器虽然也是Keep Alive,
但目的完全不同,保活计时器是用于Server端建立连接后迟迟收不到请求的情况,
而零窗口探测报文只是用于询问对方现在是否愿意接受字节(观测对方ACK报文的rcv_wnd)
拥塞控制
这位更是理论重重点,大题必考。
没啥讲的必要,写了也0个人会看。
后记
UDP后续再补,这篇博客目前很水,
不过水就水吧,确实没有太多需要说的。
先这样发了。