1.网络
单机时代-局域网时代-广域网时代-移动互联网时代
局域网时代:通过路由器把几个电脑连接起来。
广域网时代:把更多的局域网连接到一起,构成的网络更庞大,可能已经覆盖了一个城市/国家/全世界。
2.什么是路由器?
路由器就是一个用来连接其他设备的中转站。
一般家用的路由器有5个接口(1个WAN和4个LAN),WAN是用来连接上级路由器的,LAN是用来连接电脑(实现多台电脑之间的通信,一个LAN口对应一台电脑)。
ps:一般的家用电脑只有一个网口。
3.什么是交换机?
是用来扩展路由器的端口。
eg:
4.IP地址
是用来描述一台设备在网络中的地址,使用一个32位(4字节)数字表示(一般来说IP地址是用4个0~255的十进制数字并且使用3个点相隔表示=> 点分十进制)
5.端口
区别一个主机上不同的应用程序,一个端口对应一个应用程序,但是一个应用程序可能会绑定多个端口(是一个2字节的整数)。
1~1023范围内的端口号有特定的用途(0不使用),如果是要自定义端口建议使用1024~65535内的。
在实际通信过程中往往IP地址和端口号是成对出现的。
6.协议
是一种约定,约定通信双方按照什么样的方式来进行通信(传递数据)。
网络上本质是通过光/电信号来进行传输的。
7.协议分层
按照协议的定位/作用进行分类,并且约定了不同层次之间的"调用关系"。
(1)为什么需要协议分层?
平时写代码的时候,写的多了,往往需要把代码分成多个部分(拆分之后,更容易理解,是基于人的基本认知规律)。
如果一个大的协议来解决所有的问题,此时这个协议就非常大和复杂,不太容易让人理解。
相比之下,可以将这个大的协议给拆分成多个协议,让每个小的协议只是专注于做一小块事情,这样一来,代码就更容易理解。但是由于网络通信是很复杂的,往往一个协议会被拆分成很多很多的小协议,此时就需要对这些协议进行分层。
(2)好处:
a.协议进行分层之后,上层和下层协议彼此都进行了封装,使用上层协议不必过多关注下层,使用下层协议不必过多关注上层协议。
b.每一层协议可以根据需要灵活进行替换。
8.TCP/IP五层网络模型(还有个OSI七层网络模型)
(1)解释:
a.物理层:描述网络通信的硬件设备。
b.数据链路层:两个相邻节点之间的数据传输情况。
c.网络层:进行路线规划。
d.传输层:关注起点和终点。
e.应用层:应用程序如何使用这个数据(程序员最需关注的一点)。
(2)作用:
a.应用层:就是对应到应用程序(程序员手动实现的代码)。
b.传输层和网络层:也称操作系统。
c.数据链路层和物理层:驱动程序+硬件。
9.封装和分用
描述了网络通信过程中,基本的数据传输流程。
(1)封装:
是发送方进行的操作,目的在于给数据添加更多的"辅助信息"。从上层协议到下层协议,是一个层层对数据报进行拼接报头的过程。
eg:现在要A要通过QQ把一个消息传递给B
a.应用层
QQ应用程序,QQ就会把A输入的信息(hello)给打包成一个数据报(格式是啥并不知道,得QQ得程序员才知道),现在假设格式为:
用四个字段来进行分割,这里就构成了一个简单的应用层数据报(采用字符串拼接的形式),上述描述的规则,就是此处约定的应用层协议,但是具体用几个字段,字段的顺序如何,字段之间用什么分割,这些都是可以根据需要灵活更改。
b.传输层(使用UDP)
在这里就会对刚才的数据报进行打包,变成传输层的数据报,这里打包的过程还是字符串拼接(在刚才的基础上拼接上传输层报文)。传输层打包过后,会进一步转交给网络层。
c.网络层
这里在刚才的基础上拼接上IP报头(一个数据报包含报头和载荷),进一步交给数据链路层。IP报头中包含源IP和目的IP
d.数据链路层
这里在刚才基础上拼接上以太网报头和报尾。以太网报头中包含重要的信息:源mac地址和目的mac地址(物理地址,也是用来描述设备在网络上的地址)
e.物理层
把上述数据转换成0/1的二进制数据,通过光/电信号进行传输。
(2)分用:
当上述封装过程完成后,数据报发送出去之后,就会经过一系列的交换机和路由器的转发,当数据报到达接收方之后,就要对数据报进行分用。
a.物理层
拿到光/电信号=>二进制数据=>将得到的数据交给数据链路层(以太网数据报)
b.数据链路层
通过以太网协议对数据报进行解析,这个解析过程就会解析出报头,报尾和中间的载荷,然后把载荷部分进一步交给网络层处理。
c.网路层
通过IP协议对数据报进行解析,会解析出报头和载荷,进一步交给上层(传输层)。
d.传输层
通过UDP协议对数据报进行解析,会解析出报头和载荷,进一步交给上层。
e.应用层
此时的数据就是最原始的数据,就需根据端口号把数据交给QQ这个程序,然后QQ进一步解析这里的数据,这个解析过程也就是按照前面程序员自定义的协议来进行的。
10.传输层协议
通过网络可以让两个主机之间进行通信=>基于这样的通信来完成一定的功能。
进行网络编程的时候,需要操作系统提供一组api,通过这些api(可以认为是传输层与网络层之间的交互的路径,也就是socket api,通过该api可以完成不同主机之间,不同系统之间的通信)才能完成编程。
TCP与UDP这两种协议的工作原理差异很大,导致这两种协议进行网络编程的时候,存在一定的差别,故系统分别提供了两套api。
(1)区别:
a.TCP是有连接的,UDP是无连接的。(连接是抽象的描述)
此处连接的本质是建立连接的双方各自保存对方的信息。
两台计算机建立连接就是保存了对方的关键信息。
故而要想使用TCP进行通信,则通信双方必须建立连接,做完之后才能进行通信。
使用UDP通信,则不需要建立连接就可以进行通信。
eg:这里的建立连接就好比结婚证,一式两份,夫妻双方一人一份,内容一样(记录着双方的信息),妻子一看就知道谁是她的丈夫,丈夫也一样。
b.TCP是可靠传输的,UDP是不可靠传输的
可靠传输:A->B发送信息,消息如果没有到达B这一方,A能感受到,进一步就会采取一定的措施来进行补救(超时重传之类的)
不可靠传输:A->B发送信息,A只管发送信息,不管B有没有收到(A感知不到B的状态)
在网络通信中,A->B发送一个信息,是不可能100%到达的(网络环境很复杂),要想让数据尽可能被接收到,那应该都要采用TCP,为啥还要有UDP呢?
可靠传输意味着需要付出一定的代价(机制更复杂,传输速率会降低)
c.TCP是面向字节流,UDP是面向数据报的
此处的字节流与文件操作的字节流是一个意思,TCP和文件操作是相同的,以字节为单位来传输数据,UDP则是按照数据报为单位来进行传输的。
d.TCP和UDP是全双工的
一个信道允许双向通信,就是全双工的;只允许单向通信,就是半双工的。也就是在代码中使用一个socket对象就可以进行发送/接收数据。