- 认识IP地址
IP协议有两个版本:IPv4和IPv6。在我们之后的博客中,凡是提到IP协议,没有特殊说明,默认都指的是IPv4。
IP地址是在IP协议中,用来标识网络中不同主机的地址。
对于IPv4来说,IP地址是一个4字节,32位的整数。
通常使用“点分十进制”的字符串表示IP地址,例如192.168.3.57。用点分割的每一个数字表示一个数字,范围是0~255。
- 源IP地址和目的IP地址
在IP数据包头部中,有两个IP地址,分别叫做源IP地址和目的IP地址。
- 端口号
端口号(port)是传输层协议的内容。
端口号是一个2字节16位的整数。
端口号用来标识这台主机上唯一的一个进程。
IP地址+端口号统称为套接字,它能够标识网络上的某一台主机的某一个进程。
一个端口号只能被一个进程占用。
- “端口号”和“进程ID”
在学习系统编程时,我们学习到pid表示唯一一个进程,此处端口号也是唯一表示一个进程。那两者之间的关系是怎样呢?
一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定。
- 源端口号和目的端口号
传输层协议(TCP和UDP)的数据段中有两个端口号,分别为源端口号和目的端口号,就是在描述“数据是谁发的,要发给谁”。
- TCP协议
TCP(Transmission Control Protocol)意为传输控制协议。
TCP的特征:
(1)传输层协议
(2)有连接
(3)可靠传输
(4)面向字节流
- UDP协议
UDP(User Datagram Protocol)意为用户数据报协议。
UDP的特征:
(1)传输层协议
(2)无连接
(3)不可靠传输
(4)面向数据报
UDP传收的基本单位是数据报文。
这里我们需要思考一个问题:既然TCP协议可以保证传输的可靠性,那么为什么还要使用UDP协议呢?UDP协议的意义是什么呢?我们要知道,存在即合理,UDP虽然不能保证传输的可靠性,但是它的优点是传输速度快。
- 网络字节序
内存中的多字节数据相对于内存地址有大小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大小端之分。同理,网络数据流也有大小端之分。
发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存。因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。
不管这台主机是大端机还是小端机,都会按照TCP/IP规定的网络字节序来发送/接收数据。
如果当前发送主机是小端,就需要先将数据转成大端,否则就忽略,直接发送即可。
为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
h表示host,n表示network;l表示32位长整数,s表示16位短整数。
例如:htonl表示将32位的长整数从主机字节序转换为网络字节序。
如果主机是小端字节序,这些函数将参数作相应的大小端转换,然后返回;如果主机是大端字节序,函数不作任何转换,将参数原样返回。