引言
在网络系统中,有成千上万的网络设备把整个世界串联起来,组织成一张网络。其中运行着许多复杂的、充满智慧的协议与规则,这样才足以确保数据传输的稳定性,比如不担心抢不到红包。其中,TCP算是一个重量级的嘉宾。
tcp的链接
tcp的链接、断开的话题已经有许多参考资料,这里不再赘述。
关于链接的,记录一下两个点:
-
half-connection
有一种dos攻击方式就是钻的tcp三次握手的空子。通过大量发送SYN给server,server瞬间积累大量的等着ack的half-connection,导致端口占完。
当然这是安全领域的问题,这里不过多赘述 -
2MSL
在链接关闭,发完最后一个 FIN 的 ACK 时,为了确保接受方准确收到 FIN/ACK,约定(主动关闭方)进入一个 TIME_WAIT 状态。这时候资源是未被释放,如果短时间内有大量的这种关闭链接行为,可能会引发问题。为什么是2MSL呢,等待一个 FIN + 一个ACK 来回。避免可能的同端口新链接与迟到的 FIN/ACK 冲突
tcp的数据传输
因为底层的ip协议是需要对数据进行分片传输的,那么tcp也必须把数据分段(segmentation)传输。同时,为了达到数据完整无缺的传输,那么TCP必须考虑几个问题
- 数据乱序;各个数据包可能在网络中传输路径不同、到达时间不同
- 数据丢失;由于底层网络硬件的复杂性,数据包可能丢失,比如信号干扰之类的
- 数据重复;数据丢失之后,发送方需要“补发”,致使数据包重复
- 网络拥堵阻塞;多种原因可能导致这种情况,比如:发送方,接受方数据处理能力不一致、网络数据包过多等等
下面依次对这些问题进行阐述
数据传输基本工作原理
在3次握手建立链接之后,链接双方都持有sequence number(下面称sn)。
- sender 发送带有sn的数据段(segment)