网络篇一--网络基础
一、网络发展历史和分层
1、网络发展历史简介
- 早期的ARPAnet使用网络控制协议(Network Control Protocol,NCP),不能互联不同类型的计算机和不同类型的操作系统,没有纠错功能
- 1973年由 Robert Kahn 和Vinton Cerf两人合作为ARPAnet开发了新的互联协议。
- 1974年12月两人正式发表第一份TCP协议详细说明,但此协议在
有数据包丢失时不能有效的纠正
- TCP协议分成了两个不同的协议:
用来检测网络传输中差错的传输控制协议TCP
专门负责对不同网络进行互联的互联网协议IP
从此,TCP/IP协议诞生
1983年ARPAnet上停止使用NCP,互联网上的主机全部使用TCP/IP协议。TCP/IP协议成为Internet中的“世界语”
2、网络结构分层
- 网络采用
分而治之
的方法设计,将网络的功能划分为不同的模块,以分层
的形式有机组合在一起。 - 每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。
每层向上层提供服务
,同时使用下层提供的服务
网络体系结构
即指网络的层次结构
和每层所使用协议的集合
- 两类非常重要的体系结构:
OSI与TCP/IP
OSI开放系统互联模型
- OSI模型相关的协议已经很少使用,但模型本身
非常通用
- OSI模型是一个
理想化的模型
,尚未有完整的实现
- OSI模型共有七层
TCP/IP协议族的体系结构
TCP/IP协议
是Internet事实上的工业标准
。
一共有四层
二、TCP/UDP特点
1、TCP/IP协议通信模型
2、TCP/IP协议下的数据包
3、数据的封装与传递过程
4、TCP/IP结构
5、TCP协议特点
TCP(即传输控制协议)
:是一种面向连接
的传输层协议
,它能提供高可靠性通信
(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)
适用情况:
- 适合于对传输
质量要求较高
,以及传输大量数据的通信。 - 在需要
可靠数据传输
的场合,通常使用TCP协议 - MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议
6、UDP协议的特点
UDP(User Datagram Protocol)用户数据报协议
,是不可靠的无连接的协议
。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。
适用情况:
- 发送
小尺寸数据
(如对DNS服务器进行IP地址查询时) - 在
接收到数据
,给出应答较困难的网络中使用UDP
。(如:无线网络)
适合于广播/组播式通信
中。 - MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通讯通常采用UDP协议
- 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP方式进行实时数据传输
三、TCP/IP网络编程预备知识
1、Socket
Socket 简介
- 是一个
编程接口
- 是一种特殊的
文件描述符
(everything in Unix is a file) - 并不仅限于
TCP/IP协议
面向连接
(Transmission Control Protocol - TCP/IP)无连接
(User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX)
Socket 类型
流式套接字
(SOCK_STREAM)
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收
。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。数据报套接字
(SOCK_DGRAM)
提供无连接服务
。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。原始套接字
(SOCK_RAW)
可以对较低层次协议如IP、ICMP直接访问
。
Socket 位置
2、IP地址
IP地址是Internet中主机的标识
- Internet中的主机要与别的机器通信
必须具有一个IP地址
- IP地址为32位(
IPv4
)或者128位(IPv6
) - 每个数据包都必须携带目的IP地址和源IP地址,
路由器依靠此信息为数据包选择路由
表示形式:常用点分形式
,如202.38.64.10,最后都会转换为一个``32位的无符号整数`。
3、端口号
为了
区分
一台主机接收到的数据包应该转交给哪个进程来进行处理
,使用端口号
来区别
TCP端口号
与UDP端口号
独立
端口号
一般由IANA
(Internet Assigned Numbers Authority) 管理
众所周知端口
:1 ~ 1023
(1 ~ 255
之间为众所周知端口
,256~1023
端口通常由UNIX系统
占用)注册端口
:1024~49150
动态或私有端口
:49151~65535
4、字节序
不同类型CPU的主机中,内存存储多字节整数序列
有两种方法,称为主机字节序
(HBO):
小端序
(little-endian) -低
序字节存储在低
地址
将低字节存储在起始地址
,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式;大端
序(big-endian)-高
序字节存储在低
地址
将高字节存储在起始地址
,称为“Big-Endian”字节序,由ARM、Motorola等所采用
网络中传输的数据必须按网络字节序
,即大端字节序
在大部分PC机
上,当应用进程将整数送入socket
前,需要转化成网络字节序
;当应用进程从socket取出整数
后,要转化成小端字节序
(原因?)
网络字节序
(NBO - Network Byte Order)
使用统一的字节顺序
,避免兼容性问题主机字节序
(HBO - Host Byte Order)- 不同的机器HBO是不一样的,这与CPU的设计有关
- Motorola 68K系列、ARM系列,HBO与NBO是一致的
- Intel X86系列,HBO与NBO不一致
大端
(Big-Endian):字节的高位在内存中放在存储单元的起始位置
小端
(Little-Endian):与大端相反
字节序转换函数
把给定系统所采用的字节序称为主机字节序
。为了避免不同类别主机之间在数据交换时由于对于字节序的不同而导致的差错,引入了网络字节序
。
主机字节序
到网络字节序
:
u_long htonl (u_long hostlong);
u_short htons (u_short short);
网络字节序
到主机字节序
:
u_long ntohl (u_long hostlong);
u_short ntohs (u_short short);
IP地址的转换
inet_aton( )
将strptr
所指的字符串
转换成32位的网络字节序二进制值
#include <arpa/inet.h>
int inet_aton(const char *strptr, struct in_addr *addrptr);
inet_addr( )
功能同上,返回转换后的地址。
int_addr_t inet_addr(const char *strptr);
inet_ntoa( )
将32位网络字节序二进制地址转换成点分十进制的字符串。
char *inet_ntoa(stuct in_addr inaddr);
inet_pton()
将IPV4/IPV6
的地址转换成binary格式
int inet_pton(int af, const char *src, void *dst);
到这里就结束啦!