网络通信相关基本概念

        最初接触到网络协议还是在大学的计算机网络课上,过了这么多年没想到我还是得重拾这些知识,要是早知道上课就不会开小差和玩手机游戏了[好像说的有点晚?大笑],好吧,偏题了。

        著名的OSI五层协议相信大部分人都知道,然后下面是我大概要讲的内容结构图:

看到这么多协议别害怕,我一点一点尽量用例子讲明白这些东西。

        相信大多数人是使用过ftp协议到某个不知名ftp服务器上下载过文件的,类似这样

ftp://用户名:密码@FTP服务器IP或域名:FTP命令端口/路径/文件名

ftp应该是出现的比较早的文件传送协议,很明显这类协议主要为了文件的下载和上传的,你可以理解为某个站点(服务器其实和普通电脑没啥区别的)提供给你的文件访问接口,这个协议里面有ip/域名+端口+路径/文件名。你可以想象一个需求:我如何做才能让别人看到我写的txt文件里面的内容??HTTP类似,浏览网页和文件传输通常是聚合在一起的,这里我就以ftp的使用自上而下地讲解。

        我的理解更倾向于应用层协议只是封装对象,他们把实现文件传输和实现数据包传输都相应地封装了起来,实际上对应地实现是一层一层地嵌套下来,最终都是由最底层地物理层实现。就和mybatis地结构体系实现地功能一样,把jdbc的功能拆分开来每部分都封装起来,并给它加上一些额外的功能特性。

        任何协议在传输的过程中都是一层一层的剥开,一层层解析,比如说域名----->DNS,ip+端口 ---->TCP报文解析等等。在这里提一下数据链路层,这个可以想像成在自家的局域网里面的各个主机直接通信使用的东西,如果想接到外界的互联网就得加个路由器和网关就变成了ip访问。基本到这里就是顶级的访问了,然后TCP给予一些传输控制功能,应用层再把它包装成我们容易识别的资源访问类型,域名这些都是虚的,知道别人的ip就能访问资源了。

        接下来重点地说说TCP这个协议,它有如下特性:

        1.可靠传输

        2.面向连接

        3.全双工通信

        说白了跟电话的特性一样,打电话前要先拨号,连接上就能打电话了,聊天还能你一句我一句是不是。每个TCP连接包含两个端点被抽象成Socket,由ip地址和端口号共同组成。不同于UDP的尽力交付,TCP因为实现了传输控制所以大家都称之可靠的传输。

        在比较早期的时候,TCP的可靠传输是靠停止等待机制+超时重传,但是因为这种方式(一个一个按顺序发送接收成功)太浪费信道资源了,最后发展成为现在有名的滑动窗口协议。遵循该协议的发送方和接收方各自维护一个窗口值,最开始窗口大小是哦共同协商的,之后如果遇上了网络阻塞或者其他情况窗口会根据某种算法改变。对于发送方来说,每接收到一个正确的确认就可以将自己的窗口向前仪,其实就是准备下一段数据的区间,对接收方而言,每次接收到的数据给予的确认都是以接收到的正确顺序的最后一个序号,这样能保证所有数据都能被正确的发送。一旦发送方的窗口满了之后发送方就得等待接收方给予一个新的窗口值,这涉及到流量控制的内容。

        所谓流量控制就是接收方收的已经手软了的意思。目前所用的流量控制是先把所有数据放到缓存中,先派个小兵去探探路,如果发现可行,就把后面的数据组装一下一起发过去。(Nagle算法)

        TCP的拥塞控制包含了四种可用的算法,一般都是相互结合使用的:慢开始:就是发送窗口刚开始不给那么大,比如说给2个,然后发送2个字节数据出去收到确认后就开始乘法增加,直到某个阈值threshold时使用拥塞避免算法(讲真的这么唬人,实际上就是i++嘛),如果发送方察觉到网络出现了拥塞,这时候可以选择把新的threshold /=2,将发送窗口定为1重新开始。

后来出现了快重传算法(接收方收到了乱序数据的时候就把乱序前的确认重复发送,发送方接收到重复3个确认以上就把漏掉的数据重发一遍)和快恢复算法(发送窗口定为新的阈值直接开始拥塞避免算法),不得不说这些别名看上去吓人,其实原理还是蛮简单的。

猜你喜欢

转载自blog.csdn.net/qq_36243399/article/details/79876513