TCP基础知识整理

来源:互联网 发布:Linux设置启动程序字体 编辑:程序博客网 时间:2024/06/05 17:12

一、一些常见的网络命令(Windows平台):

1.查看IP地址的命令:

ipconfig -a

2.DNS的正向解析命令:

nslookup www.baidu.com

3.反向解析命令:

nslookup -qt=ptr IP地址

4.ARP表:

arp -a

5.查看路由控制表:

netstat -anetstat -rnetstat -rn

6.traceout:充分利用ICMP超时消息的一款应用:

tracert 目标主机地址

7.windows下查看端口使用情况

netstat -aon | findstr "端口号"
netstat -n

二、一些概念:

1. 三次握手

1.1 为什么TCP要三次握手而不是两次?
答曰:因为有一种情况:第一个SYN报文延时到达了Server端,此时Client已经失效;而如果Server端在收到后就建立连接,会浪费Server端资源。详见: http://blog.csdn.net/daguairen/article/details/52670129

1.2 为什么TCP要四次挥手而不是三次?
答曰:因为Server可能还有数据需要继续发送,不能立马FIN。
详见:http://www.cnblogs.com/huhuuu/p/3572485.html

1.2.1 什么是2MSL?
答曰:所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

2. 端口号

2.1 在传输层中也有类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此它也被称为程序地址。
2.2 **五个信息来识别一个通信:
源IP、目的IP、协议号、源端口号、目的端口号**
2.3 标准既定的端口号:
知名端口号:0-1023;可以注册的端口号:1024-49151
关于知名端口号和注册端口号的信息,参见:https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
2.4 时序分配法:全权交给操作系统动态分配,动态分配的端口号在49152-65535之间;

3. 关于TCP的一些金句:

3.1 UDP vs TCP:
UDP:没有复杂控制,提供面向无连接通信服务的一种协议。换句话说,它将部分控制转移给应用程序去处理,自己却只提供作为传输层协议的最基础功能。
TCP则“人如其名”,可以说是对“传输、发送、通信”进行”控制“的协议。它充分地实现了数据传输时各种控制功能。TCP通过肯定的确认应答(ACK)实现可靠的数据传输。

3.1.2 关于数据分片:
对于UDP:数据在由IP层进行分片,所有分片到达目标主机后被重组,再传给UDP层
对于TCP:数据在TCP层进行分片,不需要重组,数据被原样发送给接收端主机的TCP层;

3.2 TCP是面向连接的协议,只有在确认通信对端存在时才有发送数据
3.3 TCP的面向连接,是指在数据通信开始之前先做好两端之间的准备工作
3.4 TCP中发送第一个SYN包的一方叫做客户端,接收这个的一方叫做服务端
3.5 TCP以一个段为单位,每发一个段(在流控制中可以一次发送若干个段)进行一次确认应答的处理,是通过TCP首部的序列号实现的
3.6 接收端给发送端的Ack确认只会确认最后一个连续的包。注意注意,这是协议本身规定的,这也是后面流控制滑动窗口等的基础。
3.7 TCP是一种流协议。流就是指不间断的数据结构。例如,在发送端发送了10次100字节的消息,那么在接收端,应用程序有可能会收到一个1000字节连续不间断的数据。因此在TCP通信中,发送端应用可以
在自己要发送的消息中设置一个表示长度或间隔的字段信息。
UDP则可以确保发送消息的大小。在UDP中消息长度的数据也会发送到接收端。

4. 滑动窗口

4.1 如果你不了解TCP的滑动窗口这个事,你等于不了解TCP协议。TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。
4.2 确认应答不再以每个分段,而是以更大的单位进行确认。窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。
4.3 窗口里的多段数据同时发送,其中如有某个段丢失,则这个段之后的段应答里,序列号都是这个丢失的段起始地址;这样,发送主机如果连续3次收到同一个确认应答,就会将其所对应的数据进行重发。
4.4 Wireshark中,你可以使用tcp.analysis.zero_window来过滤包,然后使用右键菜单里的follow TCP stream,你可以看到ZeroWindowProbe及ZeroWindowProbeAck的包。

5. 流控制

5.1 窗口大小的值是由接收端主机决定的。TCP首部中专门有一个字段用来通知窗口大小。接收主机将自己可以接收的缓冲区大小放入这个字段中通知给发送端。
5.2 窗口探测包:在没有收到Server端的窗口更新通知前,发送端主机会时不时地发送一个叫做窗口探测的数据段,此数据段仅含一个字节以获取最新的窗口大小信息。
5.3 TCP使用了Zero Window Probe技术,缩写为ZWP,发送端在窗口变成0后,会发ZWP的包给接收方,让接收方来ack他的Window尺寸。一般这个值会设置成三次,如果三次过后还是0的话,有的TCP实现就会发RST把链接断了。包类型为:ZeroWindowProbe及ZeroWindowProbeAck
5.4 发送方窗口的上限值 = Min [ rwnd, cwnd ]
当rwnd < cwnd 时,是接收方的接收能力限制发送方窗口的最大值。
当cwnd < rwnd 时,则是网络的拥塞限制发送方窗口的最大值。
5.5 拥塞窗口:
在慢启动的时候,将拥塞窗口的大小设置为1个数据段(1MSS)发送数据,之后每收到一次确认应答(ACK),拥塞窗口的值就加1。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小做比较,
然后按照它们当中较小的那个值,发送比其还要小的数据量。
5.6 滑动窗口vs拥塞窗口:
拥塞窗口是发送方使用的流量控制,而滑动窗口则是接收方进行的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。

6. 拥塞控制

6.1 拥塞控制,为的是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。
6.2 拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。
四个算法:1)慢启动,2)拥塞避免,3)拥塞发生,4)快速恢复。
慢启动:Slow Start,拥塞窗口长度按指数增长
拥塞避免:Congestion Avoidance,拥塞窗口长度按线性增长。即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。
快重传:fast retransmit ,拥塞窗口cwnd大小降为自身一半,阈值为降值后的cwnd。然后进入快速恢复算法。快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时才进行捎带确认。
快速恢复:Fast Recovery
cwnd = sshthresh + 3 * MSS (3的意思是确认有3个数据包被收到了)
重传Duplicated ACKs指定的数据包
如果再收到 duplicated Acks,那么cwnd = cwnd +1
如果收到了新的Ack,那么,cwnd = sshthresh ,然后就进入了拥塞避免的算法了。

7. 重传机制

7.1 超时重传机制:接收方在未收到丢失包时,即便收到了后续的包,也不发ack;发送端死等丢失包的ack,直到超时,然后引发重传机制。
7.2 快速重传机制:Fast Retransmit算法,不以时间驱动,而以数据驱动重传。也就是说,如果,包没有连续到达,就ack最后那个可能被丢了的包,如果发送方连续收到3次相同的ack,就重传。Fast Retransmit的好处是不用等timeout了再重传。
7.3 这两个机制在具体实现中,都面临这个问题:是重传之前的一个还是重传所有的问题。
7.4 SACK 方法:Selective Acknowledgment (SACK),这种方式需要在TCP头里加一个SACK的东西,ACK还是Fast Retransmit的ACK,SACK则是汇报收到的数据碎版。当然,这个协议需要两边都支持。在 Linux下,可以通过tcp_sack参数打开这个功能(Linux 2.4后默认打开)。
虽然 SACK 可以提高吞吐量,但事实证明,对于 TCP 发送方来说,处理这种类型的应答严重占用 CPU。这个弱点在商业网点中可能会被一些恶意的同行利用。
7.5 Duplicate SACK:
Duplicate SACK又称D-SACK,其主要使用了SACK来告诉发送方有哪些数据被重复接收了。
7.6 超时重传算法:
1 加权移动平均;
2 Karn / Partridge 算法:不把重传的RTT做采样,一旦发生重传,之前的rtt就翻倍,即所谓的指数退避算法(Exponential backoff);
3 Jacobson / Karels 算法:前两种算法的问题:前面两种算法用的都是“加权移动平均”,这种方法最大的毛病就是如果RTT有一个大的波动的话,很难被发现,因为被平滑掉了。这个算法引入了最新的RTT的采样和平滑过的SRTT的差距做因子来计算。这个算法在被用在今天的TCP协议中。

8. 一些常见缩写:

8.1 RTT:Round Trip Time,也就是一个数据包从发出去到回来的时间。
8.2 RTO:Retransmission TimeOut,超时重传时间
8.3 MSS:Maximum Segment Size 最大消息长度。最理想的情况是MSS正好是IP中不会被分片处理的最大数据长度。
TCP在传送大量数据时,是以MSS的大小将数据进行分割发送。进行重发时也是以MSS为单位;
根据路径MTU的大小计算出MSS,在三次握手阶段,取双方最小的MSS值作为最终的MSS值。
8.4 Mobile IP:能够使得在主机所连接的子网IP发生变化时,主机IP地址仍保持不变。

9. 其他

9.1 所有的域名服务器都必须注册根域名服务器的IP地址。因为DNS根据IP地址进行检索时,需要从根域名服务器开始按顺序进行。
根域名服务器地址:
http://www.internic.net/zones/named.root

10. 路由协议

  1. 互联网是由路由器连接的网络组合而成的。只有BGP、RIP和OSPF共同进行路由控制,才能够进行整个互联网的路由控制。
  2. IGP:Interior Gateway Protocol,域内路由协议,自治系统(路由选择域)内部动态路由采用的协议
  3. EGP:Exterior Gateway Protocol,域间路由协议,自治系统之间的路由控制采用的协议
  4. 水平分割:Split Horizon,规定路由器不再把所收到的路由信息原路返还给发送端。
  5. 毒性逆转:Poisoned Reverse
  6. 触发更新:Triggered Update
  7. 每个网络域都有一个AS号,BGP根据这个编号进行相应的路由控制
  8. AS之间通过签署合约再进行连接
  9. BGP扬声器:
  10. 具有多个区域的自治系统必须要有一个主干区域(Backbone Area),并且所有其他区域必须都与这个主干区域相连接。
  11. 内部路由器:区域内的路由器
  12. 区域边界路由器:连接区域与主干区域的路由器
  13. 主干路由器:只与主干区域内连接的路由器
  14. AS边界路由器:与外部相连接的路由器

三、参考文献:

1.《图解TCP/IP》;
2.《TCP 的那些事儿(上)》http://coolshell.cn/articles/11564.html
3.《TCP 的那些事儿(下)》http://coolshell.cn/articles/11609.html
4.《TCP 选择性应答的性能权衡》https://www.ibm.com/developerworks/cn/linux/l-tcp-sack/
5.《tcp协议头窗口,滑动窗口,流控制,拥塞控制关系》http://www.cnblogs.com/zlingh/p/6161088.html

原创粉丝点击