TCP/IP分层模型与网络认知

来源:互联网 发布:mac如何添加输入法 编辑:程序博客网 时间:2024/06/06 14:24

自从参加了工作,对于网络底层协议的透彻了解越来越在工作中占大比例,而以往在关于网络编程上,计算机网络基础也仅仅停留在who是tcp,who是http的层面,真正网络传输的一整套流程和模型没有基础性认知,为此专门花时间将新学习到的计网知识记录于此,以便自己巩固和帮助他人。

  • 分组交换/包交换
    如今所有的计算机网络都是分组交换了,将计算机之间交换的数据按包package进行拆分,然后再到网络中传输,这种机制有个最大的好处就是节省网络搭建成本——以传统电话网(电路交换)为反例,我们在偏远地区拨打电话,不是每次都能听到嘟嘟的响声(其实没有跟目标节点建立电缆连接),以为本地电缆已经饱和,无法再提供给你,等到其他人挂电话,电缆空出来,你才能获得相应的连接。而分组交换,将网络覆盖区中所有计算机的传输数据都共享同一条电缆,因为其数据包上各自包含了自己的目标地址,所有会以数据包为基本单位进行路由。当然,还有其他的好处,比如能进行包的检验。

  • 主机网络层

    在tcp/ip网络模型中,处于底层的网际层,负责将所有数据通过物理设备传输到目标节点上。而所谓的数据,无非是二进制的数据位,0010101001,在电缆传输中,将其转换成电磁波,通过线缆移动来传输数据。当然了,如果用的是wifi,那就是将数据位转换成了无线电波,在空气中移动。

  • 网际层IP

    其实可以理解为路由,寻址层,就是寻找目标计算的相关逻辑层,IP数据包,每个数据包上包含了首部、源地址、目的地址和数据body。IP协议又分为IPV4和IPV6,地址长度从32位编导128位,一般v4的数据包大小在几十B到8KB左右,而V6似乎有点变态,能达到4G。IPV4由4个字节组成,每个字节最高位转换成十进制是255,IPV6由16个字节组成,分成8个区块,每个区块是4个十六进制的数字。

  • 传输层
    TCP协议中,为了保证可靠性,要解决数据包的破坏、丢失和传输顺序。如果数据包从源TCP层中发出,传输到目标TCP层时,检查机制发现数据包被破坏或者丢失,就原路返回到源TCP层,进行数据包的重传。所以TCP协议要置于ip协议之上,才能在连接的两端确认接收IP包的情况,进行重传和检查顺序等。对于java程序员来说,只需要认识TCP和UDP以及建立在其上的应用层协议就可以了。这里提到UDP,可能大家会觉得这是很不可靠的东西,但是在例如视频、直播类的传输中就是使用UDP,原因我自己总结有:用户对数据完整度不敏感,丢失一两个数据位对用户来说可能感觉不到;再者如果使用的是TCP,当出现丢包使用,TCP为了保证完整性和顺序,要等待所有包接收完毕才传到应用层,这对于用户来说是很致命的,假如你观看一部电影,视频加载因为后面一段数据位丢失而导致前面加载好的内容不能先观看,真是fuck;最后UDP还能通过一个方案,比如纠错码等来解决丢包等问题。

  • 应用层
    网络数据从TCP传输上来后,如何变成用户想要的效果呢,比如用户想看到一张图片,而TCP传过来的只是一串数据流,那么进行这个转换工作的,就是应用层干的。在网络数据的传输中,应用层是最费时间的(传输数据成果的情况下)。我们可以自定义应用层协议,解析不同数据流成为我们想要的效果。很多公司内部自定义的协议,都是基于http的,这样就可以复用http应用层的解析成果,然后再扩展自己想要的功能。


再来聊聊网络中的广播,这个功能场景似乎很重要,但平时接触到却没去思考这是它的功能。比如在一个本地网络中接入一台笔记本电脑,想象成脸上wifi,那么这台设备会向本地网络中所有节点发送一次广播,寻找本地网络的DHCP节点。只有本地网络中的DHCP服务器(一般是路由器)会理他,给他回应这台笔记本今后在这个本地网络中的标志(内网IP地址),可能还附带了本地的DNS服务地址之类的。


传闻解决IPV4燃眉之急的NAT技术,内网的设备,如上文的笔记本电脑访问www.baidu.com,在请求数据包经过NAT路由器的时候,其IP报文上的源地址改成了路由器的外网地址,然后再请求到百度的首页服务器。百度返回的数据包,只能达到路由器,路由器中经过内部的映射表,入站连接路由到内网对应的服务器上。