计算机网络知识解析

本篇文章主要讲的是计算机网络相关的内容,需要有一定的计算机网络的基础知识才能汲取更多的知识。当然没基础也可以看懂,会对计算机网络有一个基础的理解。在这一篇介绍中,我尽可能的覆盖一些面试中的问题,通过本篇文章,无论你是实际开发,还是准备面试的过程中,都能对计算机网络都有一个比较深入的理解。

文章内容时不时会追根问底,比如三次握手的过程是什么,深入一点的问题就是为什么需要三次握手,而不是俩次握手,诸如此类的模式。文章可能会比较长,但是抽出半小时到一个小时的时间来读此篇文章,会让你理清计算机网络的相关知识。

本篇文章只会讲到网络层之上,网络层之下的数据链路层和物理层本文不做深入的讨论,毕竟在往下属于便硬件相关的内容了,而不是软件开发相关的内容。

文章的主要内容有:

  1. 计算机网络概述

    1. 应用层

    2. HTTP

    3. Socket

    4. 传输层

    5. TCP

    6. UDP

    7. 网络层

      • IP
      • DHCP
      • ICMP

计算机网络概述:

计算机网络是通信技术与计算机技术结合的产物,也就是说计算机网络就是为了解决计算机与计算机之间通讯的问题。什么是通讯的问题,就是数据交换的问题,也是信息交换的问题。在现实世界中,我们用信息来形容交换的内容,在计算机世界里,我们用「数据」这个词来代替。这些词都是对内容的抽象概括,因为现实世界需要交换的内容太复杂了,一段文字称之为信息,一张图片也叫信息。所以这些词都是对这些内容的抽象概括,其实完全没有那么高大上,意会了就好。

继续讲,我们知道,与计算机网络相关的东西有哪些,大家可以列举出很多,比如网线,网卡,路由器,计算机中的 IP 地址。专业一点的人知道 TCP UDP,HTTP ,FTP。这些东西分别对应着计算机网络中不同的层次。层次有不同的分法, OSI(网络)模型将计算机网络分成了七层(搜索关键词 OSI 七层模型),因为分的太多太细,跟现实生活中操作有一些不匹配,被我们称为理论上的成果,市场上的失败,但却是我们学习计算机网络的好工具。

在市场上成功的方式是将计算机网络分成五层或者四层。我喜欢按五层来分。刚刚列举出关于计算机网络的内容中,网线属于物理层,网卡属于数据链路层,路由器属于网络层,对应的协议有 IP ,ICMP等。最后一个字母 P 代表 Protocol 协议的意思,因为狗血的语言不合的问题,我们还时不时的称之为 IP 协议,HTTP 协议等,重在理解,叫什么就无所谓了。

还有计算机网络拥有的是一个体系结构,分成那么多层是因为计算机网络体系太复杂了,还涉及到各种各样的组成部分,一次性规范这么多内容不太现实,所以我们按不同设备按照功能划分成不同的层次。这样做的好处是每一层对其他层来说都是透明的,更利于标准化。某一层变化了,不影响其他层的工作。

分层思想在计算机领域应用的还是比较多的。分层带来的好处就是透明,更容易制定标准。如何理解透明这一概念,透明的含义就是我不需要知道你是怎么工作的,我想要什么你能给什么就行。最简单的例子,我玩手机不需要知道手机是怎么工作的,我只要会点屏幕就行,我能处理你给我展现的内容就行。屏幕显示的内容就是手机提供给我们的内容。但是内部电池如何供电,供多大的电流,我们不需要考虑。这就是透明的含义。

在计算机网络中也是如此,不需要理解上层和下层是怎么工作的,我只需要接受下层给我的数据,并且我能看懂,经过我这层之后,我按照上层在一开始规范好的数据格式,提交给上一层,上一层就会能正确的接收我提交的数据。分层之后,某一层的修改不会影响其他层。怎么理解呢,IPv4 和 IPv6 都处于网络层,属于不同版本的协议,但是从 IPv4 切换到 IPv6 对于应用层的 HTTP 来讲是没有区别的,HTTP 不需要管你用的是 IPv4 还是 IPv6,你按照我这 HTTP 的格式传上来数据就行。就是这个意思。

应用层

应用层有着不同的协议,每个协议也都有不同的功能和用法,在这一层协议是最丰富的,但也更佳具体。比如 HTTP 用于我们网页内容的传输。FTP 用于文件的传输。SMTP 用于邮件的传输,还有 TELNET等等。每一个协议都比较复杂,都有详细的规定,对协议的描述也比较细致,实现的功能也比较多,所以就不在这里写了。如果你有需要,可以定向的了解某一个协议的详细内容。

Socket

在应用层和传输层之间有一个接口叫做 Socket。Socket 不属于某一个层,它是就像是应用层和传输层之间一个管道,用来连接操作系统和应用层中的具体的应用进程。应用可以操纵 Socket 来使用操作系统的网络功能。Socket 翻译过来叫「套接字」。很奇怪的名字。因为传输层之下一般都是由操作系统来控制,而应用层的一些协议是由应用进程来控制的,所以我们需要一个接口来建立起应用进程和底层协议的桥梁,这个接口呢叫做 API(应用编程接口)。UNIX 定义了一个具体的实现,叫做 Socket。

现在大多数操作系统都支持 Socket。微软也做了一个改进的API,叫做 winSock。其实就是 API 在不同操作系统上,定制化开发的一个 API,不知道你们理解了没有。还要区分的是现在火起来的 WebSocket。WebSocket 是应用层的协议。而 Socket 不属于某个层,实现的是进程跟操作系统在网络通讯方面的接口的具体实现。因为接口指的是 API,具体实现指的是 Socket。我们可以面向 Socket 编程,也就是自己定义了一个传输协议来实现计算机双方的通信。

就比如说你觉得 HTTP 太复杂了,状态码缓存什么的太臃肿了,我要自己写一个程序,其实你只需要使用 Socket 发送和接收数据,用代码来处理传输过来的数据,完全就完全能满足计算机间的通信问题,根本不需要在遵循其他应用层的协议了。你创造的数据处理规则就可以称之为自定义的协议。

你写的这个程序运行起来,操作系统就会自动分配给你一个端口号,在加上本机的 IP 地址,就能唯一的确定你这个程序的进程,等操作系统接收到发给你这个程序的数据,地址为 IP:分配的端口号 ,就会找到你的这个进程,把数据提交给你,进程就按照程序的逻辑来处理数据了。端口号是你使用 Socket 的一些函数时自动分配给你或者你手动配置的。那大家知道那么多端口号是怎么来的了吧,就是为了区分不同的进程,用于通讯的。像一些 Web server ,如 Nginx,肯定也利用了 Socket ,才能绑定了80端口。

传输层

传输层最典型的俩个协议是 TCP 和 UDP。当然还有其他的,如果好奇的可以去了解一下,比如 DCCP,SCTP 等。传输层提供的是应用进程之间的逻辑通信机制。怎么理解呢,我们知道电脑上运行着不同的进程,而在传输层,就要区分出这个数据是送到哪一个进程的。靠的是什么呢,靠的就是端口号。一个网络进程一定会使用 Socket,使用 Socket 就会随机分配一个端口号,或者利用 Socket 的绑定函数,手动把某一个端口号绑定到这个进程上。

多路复用,传输层有一个 TCP 和 UDP 多路复用的说法,这跟物理层中的多路复用不太一样,物理层的多路复用指的是物理线路上的复用方式,包括频分复用,时分复用,码分复用,波分复用(与频分复用属于一个类型,波长与频率是有关系的),而在传输层中讲的多路复用是多个数据报同时接收,计算机是如何处理这些数据包的,是如何分发,按什么原则分发,传输层的多路复用讲的是这个。在传输层之下,所有数据包都经历了相同的处理,但到了传输层不同的数据报传输就有了区别。「所有」其他主机给我发送的「所有」UDP 数据报都会被提交给同一个端口。而根据连接的不同会将 TCP 数据报分给不同的端口。因为 TCP 连接是一对一的,每一个端口只对应一个连接,也同时对应另一台主机上的唯一一个端口。就算另一台主机想和我同时建立俩个TCP连接,那需要创建俩个进程或者线程,还需要俩个端口号。

下面详细讲一下 UDP 。

UDP 只是对 IP 协议进行简单的拓展。很简单的拓展。简单到做了什么事呢,就是网络层传输来的数据,区分一下端口号,就递送给进程了,如果愿意的话会选做一下错误检测。除了这些,他什么都没有做。这种简单的拓展带来了很多好处,因为简单,所以更容易的自定义,可以根据自己的需求添加一些功能,在哪自定义?在应用层。应用层可以处理 UDP 数据报,然后按照自己的想法去更改网络传输时的具体要求。UDP 除了易于在应用层对其拓展,还带来的以下的好处:

  1. 相比于 TCP 不需要建立连接,所以发送数据的延迟小,不用辛辛苦苦先建立好连接之后在发送,可以想发就发。
  2. 实现比较简单,不需要负责的实现过程。比如维护连接等。
  3. 头部开销比较小。在数据内容之上,UDP会在数据中额外添加一下数据用于区分端口号和差错检测字段,这些数据称之为 U
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值