一、预备知识
1.1 理解 IP 地址
在 IP 数据报头部中,有两个 IP 地址,分别叫做源 IP 地址,和目的 IP 地址。
思考:我们光有 IP 地址就可以完成通信了嘛? IP 地址能够标识互联网中的唯一的一台主机。想象一下发 qq 消息的例子,有了 IP 地址能够把消息发送到对方的机器上,但是还需要有一个其他的标识来区分出,这个数据要给哪个程序进行解析。
1.2 认识端口号
两台主机间通信并不是使用机器通信,而是使用机器上的程序进行通信,程序也就是进程,所以需要一个标识来标记主机中的进程,也就是这里所讲的端口号,端口号(port)是传输层协议的内容,能够标识主机中唯一的一个进程。
- 端口号是一个 2 字节 16 位的整数
- 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理
- IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程
- 一个端口号只能被一个进程占用
传输层协议(TCP 和 UDP)的数据段中有两个端口号,分别叫做源端口号和目的端口号,就是在描述'数据是谁发的,要发给谁'。
1.3 理解网络套接字
IP 地址能够标识互联网中的唯一的一台主机,端口号能够标识主机中唯一的一个进程。也就是说{IP 地址,port},就能够标识网络中唯一的一个进程,使用网络进行通信的本质就是使用{IP 地址,port}进行通信的,它的名字叫做网络套接字。
1.4 理解'端口号'和'进程 ID'
我们之前在学习系统编程的时候,学习了 PID 用来表示唯一一个进程;此处我们的端口号也是唯一表示一个进程。那么这两者之间是怎样的关系?
PID 是用来标识主机上的进程的,port 是用来标识主机上用来进行网络通信的进程的。由于主机上并不是所有进程都需要进行网络通信的,并且我们希望其他模块(进程模块)与网络模块进行解耦,所以就有了端口号的概念。
一个端口号通常与一个进程进行绑定,一个进程也可以绑定多个端口号,但是一个端口号不能被多个进程绑定。
1.5 认识 TCP 协议与 UDP 协议
此处我们先对TCP(Transmission Control Protocol 传输控制协议)和UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识,后面我们再详细讨论 TCP 和 UDP 的一些细节问题。大家不要被两个协议特点所迷惑,这两个协议只有不同,没有好坏。
TCP 协议的特点
- 传输层协议
- 有连接
- 可靠传输
- 面向字节流
UDP 协议的特点
- 传输层协议
- 无连接
- 不可靠传输
- 面向数据报
1.6 网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分。那么如何定义网络数据流的地址呢?
- 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出
- 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存
- 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址
- TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节
- 不管这台主机是大端机还是小端机,都会按照这个 TCP/IP 规定的网络字节序来发送/接收数据
- 如果当前发送主机是小端,就需要先将数据转成大端;否则就忽略,直接发送即可
二、socket 编程接口
2.1 socket 常见 API
// 头文件
#



