这一篇TCP总结请收下

TCP这些东西,基本每个程序猿都或多或少是掌握的了。虽然感觉在实际开发中没有什么用武之处,但,面试他要问啊

这一篇TCP总结请收下

而最近大家伙过完年,也都在准备春招,我也一样。阅读了一些okHttp源码之后,又屁颠屁颠地跑回来重新把tcp、http这些东西给重新学了一遍。okHttp基本都是这些协议的实现,而理解源码的基础是,理解tcp、http。

重新看了一遍tcp之后,我把这些东西给总结了下来,也就有了这篇文章。

计算机网络的知识特点就是:琐碎。靠背诵“面试八股文”估计没多久就忘了。TCP是计算机网络运输层的一个协议,所以首先要对计网分层结构以及运输层有一定的理解。然后是TCP的四个重点:面向连接、可靠传输原理、流量控制和拥塞控制,最后再补充一点粘包和拆包的知识。

计网分层结构

考虑最简单的情况:两台主机之间的通信。这个时候只需要一条网线把两者连起来,规定好彼此的硬件接口,如都用USB、电压10v、频率2.4GHz等,这一层就是物理层,这些规定就是物理层协议

这一篇TCP总结请收下

我们当然不满足于只有两台电脑连接,因此我们可以使用交换机把多个电脑连接起来,如下图:

image.png

这样连接起来的网络,称为局域网,也可以称为以太网(以太网是局域网的一种)。在这个网络中,我们需要标识每个机器,这样才可以指定要和哪个机器通信。这个标识就是硬件地址MAC。硬件地址随机器的生产就被确定,永久性唯一。在局域网中,我们需要和另外的机器通信时,只需要知道他的硬件地址,交换机就会把我们的消息发送到对应的机器。

这里我们可以不管底层的网线接口如何发送,把物理层抽离,在他之上创建一个新的层次,这就是数据链路层

我们依然不满足于局域网的规模,需要把所有的局域网联系起来,这个时候就需要用到路由器来连接两个局域网:

image.png

但是如果我们还是使用硬件地址来作为通信对象的唯一标识,那么当网络规模越来越大,需要记住所有机器的硬件地址是不现实的;同时,一个网络对象可能会频繁更换设备,这个时候硬件地址表维护起来更加复杂。这里使用了一个新的地址来标记一个网络对象:IP地址

通过一个简单的寄信例子来理解IP地址。

我住在北京市,我朋友A住在上海市,我要给朋友A写信:

写完信,我会在信上写好我朋友A的地址,并放到北京市邮局(给信息附加目标IP地址,并发送给路由器)

邮局会帮我把信运输到上海市当地邮局(信息会经过路由传递到目标IP局域网的路由器)

上海市当地路由器会帮我把信交给朋友A(局域网内通信)

因此,这里IP地址就是一个网络接入地址(朋友A的住址),我只需要知道目标IP地址,路由器就可以把消息给我带到。在局域网中,就可以动态维护一个MAC地址与IP地址的映射关系,根据目的IP地址就可以寻找到机器的MAC地址进行发送

这样我们不需管理底层如何去选择机器,我们只需要知道IP地址,就可以和我们的目标进行通信。这一层就是网络层。网络层的核心作用就是 提供主机之间的逻辑通信 。这样,在网络中的所有主机,在逻辑上都连接起来了,上层只需要提供目标IP地址和数据,网络层就可以把消息发送到对应的主机。

一个主机有多个进程,进程之间进行不同的网络通信,如边和朋友开黑边和女朋友聊微信。我的手机同时和两个不同机器进行通信。那么当我的手机收到数据时,如何区分是微信的数据,还是王者的数据?那么就必须在网络层之上再添加一层:运输层

这一篇TCP总结请收下

运输层通过socket(套接字),将网络信息进行进一步的拆分,不同的应用进程可以独立进行网络请求,互不干扰。这就是运输层的最本质特点:提供进程之间的逻辑通信 。这里的进程可以是主机之间,也可以是同个主机,所以在android中,socket通信也是进程通信的一种方式。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxxgs.html