IP地址
概念
使网络中的设备都有唯一的地址标识,用于表示其在网络中的位置。
格式
IP地址是一个32位的二进制数,通常被分割为4个8位二进制数(也就是4个字节),如:01100100.00001000.00001010.00000110。通常用“点分十进制”的方式进行表示,即 a.b.c.d 的形式(a,b,c,d都是0~255之间的十进制整数)。如:192.168.1.2。
特殊IP
- 0.0.0.0:用于表示“不清楚”的主机和目的网络,“不清楚”是指在本机的路由表中没有特定条目指明如何到达。
- 255.255.255.255:广播地址,指广播域内的所有主机,类似于“所有人”的意思,这个地址不能被路由器转发。
- 127.0.0.1:本机地址,用于本机回环测试,类似于“我自己”的意思。
- 224.0.0.1:组播地址。从224.0.0.2到239.255.255.255都是这样的地址。224.0.0.1特指所有主机,224.0.0.2特指所有路由器、这样的地址多用于一些特定的程序以及多媒体程序。如果主机开启了IRDP功能,那么主机路由表中应该会有这样一条路由。
- 168.254.X.X:如果主机启用了DHCP功能,主机未能从DHCP服务器上获取IP地址,那么Windows系统会自动分配一个这样的地址。
- 10.X.X.X、172.16.X.X~172.31.X.X、192.168.X.X:私有地址。
端口号
概念
用于标识主机中发送数据、接收数据的进程。
格式
端口号是0~65535(两个字节)范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。
分类
按端口号分类
- 公认端口号(知名端口号):0~1023。通常这些端口的通讯表明了某种服务的协议,如:80端口对应于http通信,21端口绑定与FTP服务,25端口绑定与SMTP服务,135端口与RPC(远程过程调用)服务。
注册端口:1024~49151。它们松散的绑定于一些服务,也就是说有许多服务绑定于这些端口,这些端口同样用于其他许多目的,如:许多系统处理端口从1024开始。
动态或私有端口:49152~65535。理论上,不应为服务分配这些端口,通常机器从1024开始分配动态端口。例外:SUN的RPC端口从32768开始。
按协议类型分类
- TCP端口:即传输控制协议端口,需要在客户端和服务器之间建立连接,这样可以提供可靠的数据传输。常见的包括FTP的21端口,Telnet的23端口,SMTP的25端口,HTTP的80端口。
- UDP端口:即用户数据报协议端口,无需在客户端和服务器端建立连接,安全性得不到保障。常见的DNS的53端口,SNMP(简单网络管理协议)的161端口,QQ使用的8000和4000端口。
- 保留端口:UNIX有保留端口号的概念,只有超级用户特权的进程才允许给它自己分配一个保留端口号。这些端口号介于1~1023之间,一些应用程序将它作为客户与服务器认证的一部分。
常用知名端口号
- 21端口:FTP
- 22端口:SSH
- 23端口:Telnet
- 80端口:HTTP
- 443端口:HTTPS
注意事项
- 两个不同的进程,不能绑定同一个端口号,但一个进程可以绑定多个端口号。
- 不要使用端口号小于1024的端口。
- 客户端端口号因存在时间很短暂又称临时端口号,大多数TCP/IP实现给临时端口号分配1024---5000之间的端口号。大于5000的端口号是为其他服务器预留的 。
- 一个进程启动后,系统会随机分配一个端口(启动端口)。
进程绑定一个端口号后,fork一个子进程,可以实现多个进程绑定一个端口号,但不同的进程不能绑定同一个端口号。
协议
概念
网络协议,简称“协议”,是网络通信经过所有网络设备都必须共同遵从的一组约定、规则。协议最终体现在网络上传输的数据包的格式。
协议三要素:
- 语法:数据与控制信息的结构或格式
- 语义:需要发出何种控制信息,完成何种动作以及做出何种相应
- 时序:即事件实现顺序
协议分层
对于网络协议来说,往往分成几个层次进行定义。
分层的作用
分层最大的好处,类似于面向接口编程:定义好两层间的接口规范,让双方遵循这个规范来对接。
在代码中,类似于定义好一个接口,一方为接口的实现类(提供方,提供服务),一方为接口的使用类 (使用方,使用服务):
- 对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可;
- 对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。
OSI七层模型
OSI(Open System Interconnection)七层模型是一个网络通信协议的标准化框架,它将计算机网络通信划分为七个层次,每一层负责不同的功能,从物理连接到应用程序的处理。它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整。通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
OSI 七层模型既复杂又不实用:所以 OSI 七层模型没有落地、实现。
实际组建网络时,只是以 OSI 七层模型设计中的部分分层,也即是以下 TCP/IP 五层(或四层)模型来实现。
TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- 应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。
- 传输层:负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。
- 网络层:负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。
- 数据链路层:负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。
- 物理层:负责光/电信号的传递方式。比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。
物理层我们考虑的比较少。因此很多时候也可以称为 TCP/IP四层模型。
封装和分用
一些常见的概念:
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。
- 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)。
- 首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息。
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理
下图为数据封装的过程
下图为数据分用的过程
两台主机间的网络通信
网络编程
网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。当然,我们只要满足进程不同就行,所以即便是同一个主机,只要是不同进程,基于网络来传输数据,也属于网络编程。特殊的,对于开发来说,在条件有限的情况下,一般也都是在一个主机中运行多个进程来完成网络编程。但是,我们一定要明确,我们的目的是提供网络上不同主机,基于网络来传输数据资源。
发送端和接收端
在一次网络数据传输时:
- 发送端:数据的发送方进程,称为发送端。发送端主机即网络通信中的源主机。
- 接收端:数据的接收方进程,称为接收端。接收端主机即网络通信中的目的主机。
- 收发端:发送端和接收端两端,也简称为收发端。
注意:发送端和接收端只是相对的,只是一次网络数据传输产生数据流向后的概念。
请求与响应
一般来说,获取一个网络资源,涉及到两次网络数据传输:
- 第一次:请求数据的发送
- 第二次:响应数据的发送。
客户端与服务端
在常见的网络数据传输场景下,把提供服务的一方进程,称为服务端,可以提供对外服务。获取服务的一方进程,称为客户端。
常见的客户端服务端模型:
- 客户端先发送请求到服务端
- 服务端根据请求数据,执行相应的业务处理
- 服务端返回响应:发送业务处理结果
- 客户端根据响应数据,展示处理结果(展示获取的资源,或提示保存资源的处理结果)