一、网络发展
独立模式:计算机之间相互独立。

网络互联:多台计算机连接在一起,完成数据共享。

局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起。

广域网WAN:将远隔千里的计算机都连在一起。

所谓"局域网"和"广域网"只是一个相对的概念。广域网也可以看作是一个比较大的局域网。
计算机是人的工具,人要协同工作,注定了网络产生的必然。
二、初识协议
"协议"是一种约定。
要想让不同厂商之间生产的计算机能够相互顺畅的通信,就要有人约定一个共同的标准,大家都来遵守,这就是网络协议。

协议本质也是软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为层状结构的。

打电话时,我们的"协议"只有两层:语言层,通信设备层。
但是实际的网络通信协议,设计的会更加复杂,需要分更多的层。
三、OSI七层模型


其实在网络角度,OSI定的协议7层模型非常完善,但是在实际操作的过程中,会话层,表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是5层协议。
四、TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采用了5层的层次结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。

物理层我们考虑的比较少,只谈软件,因此大多数时候我们直接称为TCP/IP四层模型。
为什么要有TCP/IP协议?
本质就是通信主机的距离变远了。
什么是TCP/IP协议?
TCP/IP协议的本质是一种解决方案。
TCP/IP协议能分层,前提是因为问题们本身能分层。
TCP/IP协议与操作系统的关系是什么?

所以究竟什么是协议?
关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型。
因为协议是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对方的协议。

五、网络传输基本流程
局域网(以太网为例)通信原理:
在同一个局域网的两台主机,能够直接通信。
每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac地址。
认识mac地址:
mac地址用来识别数据链路层中相连的节点。
长度为48位,即6个字节。一般用16进制数字加上冒号的形式来表示(eg:08:00:27:03:fb:19)。
在网卡出厂时就确定了,不能修改,mac地址通常是唯一的。

以太网中,任何时刻,只允许一台机器向网络中发送数据;
如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞;
所有发送数据的主机要进行碰撞检测和碰撞避免;
没有交换机的情况下,一个以太网就是一个碰撞域;
局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定。
同一个网段内的两台主机进行发送消息的过程:

因为每层都有协议,所以在进行上述传输流程的时候,要进行封装和解包。


报头部分,就是对应协议层的结构体字段,我们一般叫做报头;
除了报头,剩下的叫做有效载荷;
报文 = 报头 + 有效载荷。
不同层的完整报文的叫法:
不同的协议层对数据包有不同的称谓,在传输层叫做段,在网络层叫做数据报,在链路层叫做帧。
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部,称为封装。
首部信息中包含了一些类似于首部有多长,载荷有多长,上层协议是什么等信息。
数据封装成帧后发到传输介质上,到达目的主机后每层协议在剥掉相应的首部,根据首部中的"上层协议字段"将数据交给对应的上层协议处理。
跨网络传输流程图:

网络中的地址管理---IP地址:
IP协议有两个版本,IPv4和IPv6。我们无特殊说明,提到IP协议默认都是指IPv4。
IP地址是在IP协议中,用来标识网络中不同主机的地址;
对于IPv4来说,IP地址是一个4字节,32位的整数;
我们通常也使用"点分十进制"的字符串表示IP地址,例如 192.168.0.1;用点分割的每一个数字表示一个字节,范围是0~255;
跨网段的主机的数据传输,数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器。

理解一下IP地址的意义:

结合封装和解包,体现路由器解包和重新封装的特点:

IP地址和mac地址的区别:
目前,IP地址在整个路由过程中,一直不变;
mac地址一直在变;
目的IP是一种长远目标,mac是下一阶段目标,目的IP是路径选择的重要依据,mac地址是局域网转发的重要依据。
提炼IP网络的意义和网络通信的宏观流程:

IP网络层存在的意义:提供网络虚拟层,让世界的所有网络都是IP网络,屏蔽最底层网络的差异。
六、认识端口号
1、端口号(port)是传输层协议的内容。
1)端口号是一个2字节16位的整数;
2)端口号用来标识一个进程,告诉操作系统,当前数据要交给哪个进程来处理;
3)IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;
4)一个端口号只能被一个进程占用;

2、端口号范围划分
1)0 - 1023:知名端口号,HTTP,FTP, SSH等这些广为使用的应用层协议,它们的端口号都是固定的。
2)1024 - 65535:操作系统动态分配的端口号。客户端程序的端口号就是由操作系统从这个范围分配的。
3、进程pid已经能够标识一台主机上进程的唯一性了,为什么还要有端口号?
1)不是所有的进程都要网络通信,但是所有进程都要有pid。
2)系统和网络功能解耦。
七、理解socket
1、IP地址用来标识互联网中唯一的一台主机,port用来标识该主机上唯一的一个网络进程。
2、IP + Port就能表示互联网中唯一的一个进程。
3、通信的时候,本质是两个互联网进程代表人来进行通信。
3、网络通信的本质,也是进程间通信。
4、ip + port叫做套接字socket。
八、传输层的典型代表(这里只是有一个直观的认识)
1、认识TCP协议
1)传输层协议
2)有连接
3)可靠传输
4)面向字节流
2、认识UDP协议
1)传输层协议
2)无连接
3)不可靠传输
4)面向数据报
九、网络字节序
1、TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。
2、不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接受数据。
3、如果当前发送主机是小端,就需要先将数据转成大端;否则就忽略,直接发送即可。

为使网络程序具有可移植性,使同样的代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;
如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。