目录
- 一、网络发展背景
- 二、理解网络通信
- 三、理解IP地址
- 1.简述IP地址
- 2.IP地址的版本
- 3.提高地址利用率的技术
- 四、理解端口
- 1.简述端口
- 2.使用端口的原因
- 五、理解网络通信协议
一、网络发展背景
网络发展背景:
最初的计算机是单机,那么单机是这样传输数据的:A单机和B单机,在A单机处理完数据后,将装有数据的存储介质交付给B单机,然后B单机读取数据并处理。毫无疑问,这样太麻烦了。
因此逐步诞生了网络的概念,使用网络来进行数据的传输,大大提升了数据传输的效率。
网络的类型:
- 局域网:网络覆盖范围在1km之内的网络。
- 城域网:网络覆盖范围在20km之内的网络。
- 广域网:网络覆盖范围在20km以上的网络。
但其实局域网与广域网也只是一个相对的概念,比如整个中国的互联网对于整个世界的互联网来说,也是一个局域网。
二、理解网络通信
网络通信就是升级版的进程间通信。用QQ聊天来举例,A用户用QQ给B用户发送消息,他们进行的就是网络通信。A用户的主机上有一个QQ进程,B用户的主机上也有一个QQ进程,他们互相发送消息的本质就是A用户的QQ进程和B用户的QQ进程进行通信。因此网络通信就是不同主机间的进程间通信。
三、理解IP地址
1.简述IP地址
在生活中其实很多时候都可以听到IP地址这个概念,IP地址其实就用来在网络中唯一标识一个主机的,就像是我们的身份证一样。
在寄快递的时候,我们肯定要知道收货人的地址,不然快递怎么寄。在网络通信中传输数据时,肯定要知道接收方的地址才可以进行数据的发送,不然数据往哪里发呢。
寄快递时包裹上面不但要有收件人的地址,还要有寄件人的地址。在网络通信中,我们把发送方称为源端,接收方称为目的端。每一条数据就相当于一个包裹,数据中自然要包含目的端IP和源端IP。
也就是说,IP地址是负责记录这条数据的发送主机和接收主机的,至于谁来记录这条数据是发送主机的哪个进程发送的,是接收主机哪个进程接收的,且看下文。
2.IP地址的版本
IP地址也是有版本之分的,共两个版本:
- IPv4:这是早期的IP地址版本,也是使用最多的。
- IPv6:这是为了扩大地址数量而提出的新版本,目前还没有全面普及。(不兼容IPv4)
IPv4地址的数据类型:
- uint32_t:32位无符号整型,也就是说IPv4地址只有32位
IPv6地址的数据类型:
- uint8_t ip[16]:这是一个数组类型,数组共16个元素,每个元素的数据类型是8位无符号整型,也就是说IPv6地址的长度是128位。
3.提高地址利用率的技术
之所以推出IPv6地址就是因为IPv4地址不够用了,但是IPv6并不向前兼容IPv4,所以又针对IPv4提出了两项技术来提高地址的利用率。
- DHCP:动态地址分配。谁上网就给谁分配IP地址,这样就不会有人一直占用IP地址但不使用,但现在我们的设备基本一直都处于联网状态,所以貌似用处没那么大。
- NAT:网络地址转换技术。组建私网的技术,私网中主机对外通信使用的是同一个公网IP地址,这样就节省了大量IP地址。
四、理解端口
1.简述端口
上面用QQ聊天举例说明了网络通信的本质,这里再对上面内容进行更新。还是以送货为例子,上面已经知道了要把信息从哪里发到哪里,假设是发到爱情公寓,现在包裹到爱情公寓楼下了,快递员小哥看着没有收件人的包裹,陷入了沉思~~~~(当然,没有发货人也是不行的)。想必看到这里也就知道了,咱这条信息还差点东西啊,没收件人怎么行。
既然快递没有收件人不行,那么网络中的数据没有收件人自然也不行,收件人自然就是目的主机上接收该消息的进程,那么用什么信息在网络数据包中标识要发送给哪个进程呢?那就是端口。
端口,也就是PORT。端口是一个uint16_t 类型的数据,也就是一个无符号16位整形数据。其实端口在生活中也是挺常见的,因为有时用某个软件的时候,可能会遇到提示:某某端口被占用。那么端口究竟是干啥的?
端口其实就是用来在一台主机中标识一个进程。一个进程可以同时被多个端口标识,但一个端口只能标识一个进程。
我们用QQ给其他用户发送数据的时候,发送的数据不仅包含源端IP和目的端IP,也包括了我们自己的QQ进程的端口,以及目的端的QQ进程的端口,也就是说网络通信中的每条数据都包括了源端口和目的端口(发件人和收件人)。
可以这么理解,IP地址就像是收货人的地址,而端口则表明了一个具体的收货人。通过IP地址知道了要把数据发送给哪个主机,也就是知道了要把快递送到哪个地址。通过端口知道了要把数据发送给主机中具体哪个进程,也就是把快递交给收货人。
2.使用端口的原因
问题来了,进程不是有pid吗,pid就可以标识一个进程啊,为啥还要用端口来标识?
还是用QQ聊天来举例,我们发送消息的时候并不是两个用户直接进行数据传输的。A用户和B用户在发送消息时,其实在它们之间还有一个服务器,A用户的消息首先发送给服务器,然后服务器把数据发送给B用户,这才是完整的通信过程。如下图所示
那么这个通信流程跟端口有什么关系?
(1)试想,如果我们使用进程pid来在网络通信中标识进程。A用户和B用户通信的过程中,A用户发送给服务器的数据是不是就包括了A用户QQ进程的pid以及B用户QQ进程的pid(当然还包括了源端IP和目的端IP)。
(2)然后服务器根据指定的B用户的QQ进程的pid去发送数据。此时如果B用户突然退出QQ,然后重新打开QQ软件并登录,那么是不是就会重新创建pcb,自然就有了新的pid,可是这个新的pid和A用户发送的消息中包含的pid是一样的吗?这个谁也说不准,所以为了避免这种情况,才会使用端口这个东西。
那么A用户发送的消息如何找到服务器呢?
(1)服务器的端口和IP地址一般都是固定的,并且它固定在我们安装的程序中,所以用户不需要操心这个,程序的安装包里就内置有服务器的IP及端口号。咱们用的应用程序发送数据时,自动就使用了内置的IP和端口作为目的IP和目的端口。
(2)但是如果服务器迁移了,服务器的IP地址就会变化,我们正在使用的客户端就用不成了,就需要下载新的客户端,新的客户端中会内置新的服务器各项信息。
为什么一个进程可以有多个端口?
主要还是为了效率。看视频的时候,一个端口接收视频,一个端口接收音频,这样看视频就可以保证音画同步。
五、理解网络通信协议
网络通信协议就是约定,约定在网络通信中数据传输时使用的格式。
为什么要有协议?
(1)这个如果用日常生活中的事情来举例可以理解得非常清楚。一个中国人,一个英国人,如果他们都不懂对方的语言,一个说中文,一个说英文,这咋沟通。
(2)两个人之间说的话其实就是数据,说话的过程其实就是数据传输的过程,中国人说中文使用的是中文的数据格式,英国人说英文使用的是英文的数据格式,他们之间采用的数据格式不同,中国人就接收到英语后,如果按照中文思维进行解析,这解析的是个寂寞~~~~,英国人也是一样道理,因此数据的发送端和目的端一定要采用统一的格式才可以。
(3)因此我们可以规定一种语言,让所有的人都必须用同一种语言进行交流,这样就没有沟通障碍了(也就是大家采用同样的数据格式)。让源端和目的端使用同样的格式进行数据的发送和接收,这样就可以正常通信。这其实就是协议。