26-TCP 协议(慢启动与拥塞避免)

观察到上一个实验中的慢启动的现象后,接下来我们就详细讲讲到底是怎么一回事。 1. 慢启动算法 对于发送方来说,TCP 维护了一个变量 cwnd (congestion window),这个变量称为拥塞窗口,它的大小就是 cwnd。它表示发送方一次想要发送多少字节的数据。 cwnd 是一个动态变化的值,它会根据网络的情况实时的调整自己,最后,cwnd 就会适应网络的情况,以保证发送 cwnd 字节的数据而网络不会拥塞。最终我们关...
焦点技术 2018/03/31 669

32-网络编程概述

1. 预备知识 从网络编程开始(基于 socket 套接字的编程),我们要用到很多很多在Linux 环境编程中学到的知识,比较典型的就是信号处理,多进程,多线程这些知识。如果你对这些东西感觉还是很模糊,后面学习起来会相当困难。我并不打算把这些知识在网络编程中重复,所以如果你对这些知识感觉很困惑,请跳到《Linux环境编程学习笔记》中学习。 另一方面,有关基本的网络编程基础,在《Linux环境编程学习笔记》中的第十四章,也就是从《12...
焦点技术 2018/04/02 435

25-TCP 协议(慢启动——观察)

在上一节,我们已经介绍了网络拥塞以及常用的拥塞控制算法,另外,我们还简单的讲述了如何试探性的去探测网络有没有拥塞。实际上,慢启动算法也是这样做的,只是比这个稍稍复杂一点。 在讲慢启动算法之前, 我们先做一个实验,观察一下。 1. 实验环境 服务器 unp/protocol/tools/tcpserver/psh_serv.c,部署在 Linux 上。 客户端 unp/protocol/tools/winclient/psh_...
焦点技术 2018/03/31 659

24-TCP 协议(拥塞控制)

1.概述 在学习拥塞控制前,我们假设:接收方总是有足够大的缓存空间,接收方的接收窗口大小总是很大——这意味着接收方对数据来者不拒。 在基于这样的理想条件上,如果发送方发送的数据接收方没有收到,那么大抵上可以判断为网络出现了拥塞。 2. 网络拥塞是怎么来的 图1 某个小型局域网 图 1 所示的是一个典型的小型局域网,SW 表示交换机,R 表示路由器。基于第 1 节中所述的假设,如果 PC1 给主机 PC3 发送 ...
焦点技术 2018/03/31 449

22-TCP 协议(PSH 标志)

1. PSH 标志位 从你第一次抓包以来,PSH 标志位几乎与你形影不离。它的英文单词是 PUSH,表示“推”的意思。 1.1 接收缓冲区和发送缓冲区 在谈 PSH 标志位前,先来说说 TCP 双方是如何发送数据的。 假设有发送方 A 和接收方 B。发送方有一个发送缓冲区,接收方有一个接收缓冲区,见图 1。进程 A 发送”hello”, “world” 后,只是将这些数据写到自己的发送缓冲区,为了能讲清 PSH 的作用,不妨...
焦点技术 2018/03/31 445

31-TCP 协议(保活定时器)

1. Keep Alive TCP 保活定时器,Keep Alive,特别强调一下,不是 HTTP 协议里的那个 Keep Alive. 在 HTTP 中,keep alive 是在应用层实现的,目的在于延长连接时间,即应用层服务器如果在一定时间内(通过 keep alive 进行设置)没有和客户端交互,就关闭连接。感兴趣的朋友可以自行 baidu or google. TCP 中的 Keepalive 是 TCP 本身实现的,和...
焦点技术 2018/03/31 570

30-TCP 协议(糊涂窗口综合症)

1. 糊涂窗口综合症 糊涂窗口综合症,这个名字很有意思,原文叫 Silly Window Syndrome,简称 SWS. 一看到窗口,我们就应该反应过来这是流量控制中的东西。SWS 是这样一种情况:接收方通告了一个 1 字节的窗口给发送方,然后发送方发送了 1 字节的数据给接收方。接着,接收方又通告了一个 1 字节的窗口,这样持续下去,使网络的效率很低。 2. 解决 SWS 有两种办法可以解决此问题: 针对接收方来说,...
焦点技术 2018/03/31 580

29-TCP 协议(持续定时器)

1. 持续定时器 在我们学习滑动窗口协议的时,遇到过窗口大小为 0 的情况。接收方通告一个 0 窗口给接收方,可以用来阻止发送方继续发送数据。 如果在某个时候,接收方缓冲区有空间了,于是发送了一个非 0 窗口的通告给接收方,不幸的是这个通告丢失了,而发送方却还在死等接收方的非 0 窗口通告,接下来就成了死锁。 为了防止这种情况,发送方只要接收到了 0 窗口通告,就开启一个持续定时器(persist timer),周期性的向接收方发...
焦点技术 2018/03/31 477

28-TCP 协议(超时与重传)

TCP 超时与重传应该是 TCP 最复杂的部分之一了。Windows 和 Linux 对这部分的实现还有所不同,但是算法基本上还是差不多的。 超时重传是 TCP 保证可靠传输的基础。当 TCP 在发送数据时,数据和 ack 都有可能会丢失,因此,TCP 通过在发送时设置一个定时器来解决这种问题。如果定时器溢出还没有收到确认,它就重传数据。 无论是 Windows 还是 Linux,关键之处就在于超时和重传的策略,需要考虑两方面: ...
焦点技术 2018/03/31 773

27-TCP 协议(快重传与快恢复)

很遗憾的是,这里一节我没办法用实验演示给你看,但是我尽量用文字和图叙述清楚。 慢启动和拥塞避免算法是在 1988 年提出的,而快重传和快恢复是 1990 年提出的。既然这两个新算法是时隔两年后才提出的,那么它一定是对慢启动和拥塞避免算法的不足之处进行了改良。 1. 快重传 首先对于接收方来说,如果接收方收到一个失序的报文段,就立即回送一个 ACK 给发送方,而不是等待发送延时的 ACK(请参考《迟到的 ACK》)。所谓失序的报...
焦点技术 2018/03/31 439

友情链接