从零到无穷大

写这篇文章我已经考虑了很久,总是不愿意草草的下笔,总想等到自己对TCP理解的更深入些再提笔来写。但是又觉得,在写这篇文章的过程中,才能发现自己哪些地方理解的还不够深入,哪些地方已经掌握了。因为检测自己是否理解了一个技术原理的很好的途径,就是看自己能不能把它讲出来。下面就看看我能讲到什么程度吧。

TCP是什么?

TCP是Transmission Control Protocol(传输控制协议)的缩写。它位于网络OSI七层模型中的传输层(IP协议位于网络层;ARP协议位于数据链路层,,ARP协议将IP地址解析为物理地址)。程序中的数据会先由TCP协议包装,然后再由IP协议包装,各层由上到下用自己的协议对上层传下来的数据进行包装,传到对端后,各层再由下到上解析自己的协议并把本层解析后的数据交给更高层的协议处理。

TCP的特点TCP可靠传输的工作原理

我们知道,TCP下面的网络层提供的是不可靠的传输。而TCP要保证可靠传输,就要采取适当的措施:

当传输的数据出现差错时,让发送方重传出现差错的数据。在接收方来不及处理收到的数据的时候,让发送方适当降低发送数据的速度。

那么,发送方是如何知道传输的数据出现了差错呢,在正常的情况下,即传输的数据没有出现差错的时候,接收方会向发送方回应一个确认号。当发送方经过了一段时间之后仍然没有收到接收方的确认,就认为刚才发送的数据丢失了,因此就对刚才发送的数据进行重传,这便是超时重传。这就像两个人对话,A对B说一句话,B要回应A说他听见了第一句,然后A再对B说下一句,B再回应A说听见了第二句……如果A经过了一段时间没有收到B的回应,那么A就会认为B没有听见,A就会再说一次。这其实就是一种规则,而这种规则就是所谓的协议,通信双方都要遵守这个协议,可靠通信才能达成。

TCP报文首部格式

如图所示:

Sequence Number即报文段序号,TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,起始序号要在连接建立时设置。该序号指本报文段所发送的数据的第一个字节的序号。Acknowledgment Number即确认号,表示期望收到对方下一个报文段数据的第一个字节的序号。

通过序号和确认号,解决了网络传输中报文段乱序和报文段丢失的问题。

TCP Flags:

TCP滑动窗口(Window):滑动窗口用来做网络流控制,因为TCP要做到可靠传输,需要知道网络实际的数据处理速度,然后根据网络的实际情况进行数据发送,这样才不会引起网络拥塞,导致丢包。Window这个字段被接收端用来告诉发送端自己还有多少缓冲区可以用来接收数据。于是发送端就可以参考这个值来发送数据,避免接收端处理不过来。

TCP连接的建立与释放

TCP连接的建立,三次握手TCP连接的释放,四次挥手

所谓的四次挥手,实际上是两个两次握手,因为TCP是全双工通信,双方都需要告诉对方我要关闭了,并得到对方的确认。

总结

此文梳理了一下TCP协议的基本原理,也仅仅是最基本的东西而已,由于TCP协议过于复杂,有一些算法自己也没有完全理解,写下这篇文章,算是对自己近期所学的一个反馈吧。

不如意的时候不要尽往悲伤里钻,想想有笑声的日子吧

从零到无穷大

相关文章:

你感兴趣的文章:

标签云: