目录
一.网络基础
1.认识 "协议"
2.协议分层
(1)软件分层
(2)协议分层
3.OSI七层模型
4.TCP/IP五层(或四层)模型
5.网络和操作系统之间的关系
6.数据包的封装(封包)和解包,分用
(1)下图为数据封装,解包的过程
(2)分用
7.局域网(以太网)通信的原理
(1)局城网中两台主机可以互相通信
(2)局域网通信原理
(3)MAC地址和IP地址
(4)数据包传输通过路由器转发
二.网络编程套接字
1.源IP地址和目的IP地址
2.端口号
3.理解 "端口号" 和 "进程ID"(端口号的意义)
一.网络基础
1.认识 "协议"
"协议" 是一种约定
计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式.
计算机生产厂商有很多;
计算机操作系统, 也有很多;
计算机网络硬件设备, 还是有很多;
如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来, 约定一个共同的标准, 大家都来遵守, 这就是
网络协议;
计算机技术和通信协议是计算机网络产生于发展的两个最基本的因素
协议——计算机的视角,如何看待协议:① 体现在代码逻辑上 ② 体现在数据上
以寄快递为例:你和卖家沟通好,买一个鼠标,实际上快递员给你的是
一个包裹,里面有鼠标,
实际上多给了我一些东西,多了一张
快递单,
快递单是一块数据=>快递公司和快递点,快递小哥之间的协议。
为了维护协议,一定要在被传输的数据上,新增其他数据(协议数据)
举例:
HTTP协议是超文本传输协议;DNS协议为域名解析协议;FTP协议为文件传输协议;SMTP协议为电子邮件传输协议
2.协议分层
(1)软件分层
软件是可以分层的,为什么要分层?
1.软件在分层的同时,也把问题归类的
2.分层的本质:软件上解耦
3.便于工程师进行软件维护
网络本身的代码,就是层状结构!
(2)协议分层
层状结构下的网络协议,我们认为,同层协议 都可以认为自已在和对方直接通信,忽略底层细节
同层之间一定都要有自己的协议。
在下面这个例子中, 我们的协议只有两层(汉语协议和电话机协议); 但是实际的网络通信会更加复杂, 需要分更多的层次。分层最大的好处在于 "封装",面向对象例子。

3.OSI七层模型
OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型, 是一个逻辑上的定义和规范;
把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;
OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
但是, 它既复杂又不实用; 所以我们按照TCP/IP四层模型来讲解
在OSI模型网络分层当中,自下而上,下层为上层提供服务,下层将从上层接的信息增加一个头部

4.TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.
物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wififi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.
数据链路层: 负责设备之间的数据帧的传输和识别,完成帧同步,
差错控制,流量管理,链路管理。 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准。
交换机(Switch)工作在数据链路层.
网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由).
路由器(Router)工作在网路层.
传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层

物理层我们考虑的比较少. 因此很多时候也可以称为 TCP/IP四层模型.
一般而言
对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容;
对于一台路由器, 它实现了从网络层到物理层;
对于一台交换机, 它实现了从数据链路层到物理层;
对于集线器, 它只实现了物理层。
5.网络和操作系统之间的关系
(1)体系结构直接决定, 数据包在主机内进行流动的时候,一定是要进行自顶向下(封包)或者自底向上(解包)进行流动的。以前的所有的IO都是这样的。

(2)tcp/ip协议和操作系统之间的关系是:操作系统内部,有一个模块,就叫做tcp/ip协议(传输层和网络层),网络协议栈是隶属于OS的。
(3)同层协议都认为自已在和对方直接通信——所以每一层都要有自己的协议
(4)重谈协议——计算机的视角,如何看待协议:① 体现在代码逻辑上 ② 体现在数据上
以寄快递为例:你和卖家沟通好,买一个鼠标,实际上快递员给你的是一个包裹,里面有鼠标,
实际上多给了我一些东西,多了一张快递单,快递单是一块数据=>快递公司和快递点,快递小哥之间的协议。为了维护协议,一定要在被传输的数据上,新增其他数据(协议数据)
6.数据包的封装(封包)和解包,分用
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame). 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装 (Encapsulation). 首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息. 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理
网络传输数据的本质就是数据不断的封装和解包
(1)下图为数据封装,解包的过程
我们把每一层要交付给下一层的数据,给他添加上本层的”多出来的协议数据”(报头)拼接在原始数据的开头


(2)分用
有效载荷的分用过程:数据包添加报头的时候,也要考虑未来解包的时候,将自己的有效载荷交付给上层的哪一个协议!

下图为数据分用的过程:

两个结论:(大部分协议的公共属性)
1.一般而言,任何报头属性里面,一定要存在的一些字段支持,我们进行封装和解包,即:报头中一定要存着用于 区分报头和有效载荷 的数据
2.一般而言,任何报头属性里面,一定要存在的一些字段支持我们进行分用。即:报头中一定要存着用于 得知报文的有效载荷要给上层哪个协议 的数据
7.局域网(以太网)通信的原理
(1)局城网中两台主机可以互相通信
如果两台主机,处于同一个局城网。这两台主机可以直接通信——以太网,一种局域网的标准(以太——物理学界太空中不存在的物质叫以太,为了致敬命名以太网)以太网:站在系统的角度 就是 两台主机之间的临界资源。
(2)局域网通信原理
1.每一台主机都要有唯一的标识:该主机对应的MAC地址!
2.任何一台主机,在任何时刻,都可以随时发消息——碰撞域——无法准确的听到对应的消息——识别发生了碰撞(碰撞检测)——碰撞避免——等不碰撞了过一会儿再发消息

(3)MAC地址和IP地址
举例:从北京往云南去旅游:常识告诉我们,一般我们在进行路线选择的时候,我们一般有两套地址:
1.从哪里来<源IP>,到哪里去<目的IP>——IP地址:源IP,目的IP
2.上一站从哪里来<源mac地址>,下一站要去哪里<目标mac地址>(由“到哪里去”决定)——MAC地址: 源mac地址,目标mac地址
MAC地址:用来在局域网中,标定主机的唯一性。
IP地址:用来在广域网(公网),标定主机的唯一性。
示例:
路由器可看做一个主机同时横跨了两个局域网
所有的IP向上的协议,发送和接受主机看到的数据是一模一样的
网络 -> IP网络 屏蔽了底层网络的差异! ! !

数据“你好”从客户发出,不断封装,到以太网驱动程序完成最后封装,再通过以太网传输给路由器下的以太网驱动程序,路由器下的以太网驱动程序解包数据,传给路由器,路由器发现这个数据是要传给IPB的,再通过路由器下的以太网驱动程序封装,通过令牌环传输给目标主机所在网络,自底向上解包传输

认识IP地址
IP协议有两个版本, IPv4和IPv6. 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4 IP地址是在IP协议中, 用来标识网络中不同主机的地址; 对于IPv4来说, IP地址是一个4字节, 32位的整数; 我们通常也使用 "点分十进制" 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;
MAC地址用来识别数据链路层中相连的节点;
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).
(4)数据包传输通过路由器转发
网络传输数据的本质就是数据不断的封装和解包。路由器可看做一个主机同时横跨了两个局域网
所有的数据,必须在”网线”上跑!

二.网络编程套接字
1.源IP地址和目的IP地址
源IP地址:通信主机的源主机
目的IP地址:通信主机目的主机
两主机可以在同一个局域网也可以不在。
2.端口号
我们在网络通信的时候,不止是让两台主机通信。实际上,在进行通信的时候,不仅仅要考虑两台主机间互相交互数据。本质上讲,进行数据交互的时候是用户和用户在进行交互。用户的身份,通常是用程序体现的。程序一定是在运行中——进程!
主机间在通信的本质是:在各自的主机上的两个进程在互相交互数据!
IP地址可以完成主机和主机的通信,而主机上各自的通信进程,才是发送和接受数据的一方
IP :确保主机的唯一性
端口号(port):确保该主机上某一个进程的唯一性(则一个进程只能占用一个端口号)
IP+PORT = 标识互联网中唯一的一个进程!——>socket
网络通信的本质:就是进程间通信! ! !
一个进程可以有多个端口号,但一个端口号不可以对应多个进程
3.理解 "端口号" 和 "进程ID"(端口号的意义)
pid 表示唯一一个进程,端口号也是表示唯一一个进程的。
区别:
端口号是网络通信的概念,pid是进程管理的概念。如果我们非要用进程pid在网络通信中标识唯一一个进程,又在进程管理中标识唯一一个进程,让进程pid两用,本质上是可以的。但是这
增加了网络通信和进程管理的强耦合性。端口号更侧重于表示这个进程是需要进行网络通信的,没有端口号就表示这个进程只在本地运行。
(类似于学号和身份证号,要用学号表示一个学生在学校的唯一性)
总结:
端口号的意义:①使网络模块和进程管理模块解耦。②有端口号就表示这个进程是网络进程,没有端口号可以不考虑该进程的网络功能。