我们都有光明的未来
- 知识点:
- OSI模型,七层模型 :物理层 数据链路层 网络层 传输层 会话层 表示层 应用层
- 物理层将信息编码成电流脉冲或者其他信号用于在网上传输
- 数据链路层:物理编制 网络拓扑结构 MAC 在共享介质环境之中如何进行调度,发送和接收数据,LLC
- 网络层:负责在源和终点之间建立连接,一般包括网络寻址,可能
- TCP/IP协议的四层模型以及常见的协议:网络接口层 网间层 传输层 应用层
- 网络接口层包括用于协作IP数据在已有网络介质上传输的协议,
- 网间层:IP协议 RIP协议负责数据的包装,寻址和路由
- 传输层:对应的是传输层,提供两种端到端的通信服务
- 应用层:对应应用层和表达层,包括各种的协议
客户端服务器模型和字节序
一般来说,服务器端具有以下特征:
被动通信;
始终等待来自客户端的请求;
自己参与通信的网络接口和端口必须确定;
处理客户端的请求后将结果(响应)返回给客户端。
而客户端的特征如下:
主动通信;
需要发起请求;
自己参与通信的网络接口和端口可以不确定;
发起请求后需要等待服务器回应结果 - 编程接口BSD socket
- socket简介:译作套接字,因为由BSD UNIX引入,也称为BSD socket
可以分为:本地 socket 和 网络socket
本地socket主要用于进程间通讯,网络 socket则支持不同的协议,TCP UDP等等
在实际网络编程过程中,往往需要在 IP 地址的点分十进制表示和二进制表示之间相互转化,也需要进行主机名和地址的转换,系统提供了一系列函数,一般需要包含头文件<netinet/in.h>和<arpa/inet.h>。
- 头文件 netinet/in.h
常用操作:Socket 接口提供了 socket(2)、bind(2)、listen(2)、accept(2)、connect(2)以及 sendto(2)/
recvfrom(2)这样的函数接口。在符合要求的情况下,也可以使用 read/write 系统调用对 socket
进行数据读写。
对于socket,常用的操作有: - 创建socket :int socket(int domain, int type, int protocol);
参数列表中,domain 代表这个 Socket 所使用的地址类型,对于我们讨论的 IPv4 协议的
IP 地址,使用 AF_INET,也可以使用 PF_INET。实际上这两个值是相等的,但是通常大部
分人更习惯使用 AF_INET。
type 代表了这个 Socket 的类型,我们讨论范围是有面向流的(TCP)和面向数据报的
(UDP)Socket。分别取值 SOCK_STREAM 和 SOCK_DGRAM。
protocol 是协议类型,对于我们的应用场景,都取 0 即可。 - 绑定地址和端口:int bind(int socket, const struct sockaddr *address, socklent address_len);
socket 应该是一个指向 Socket 的有效文件描述符 。
address 参数就是一个指向 struct sockaddr 结构的指针,根据不同的协议 ,可以有不同
的具体结构,对于 IP 地址,就是 struct sockaddr_in。但是在调用函数的时候需要强制转换一
下这个指针来避免警告。
address_len,因为前面的地址可能有各种不同的地址结构,所以,此处应该指明所使用
的地址数据结构的长度。编程时直接取 sizeof(struct sockaddr_in)即可。 - 连接服务器 int connect(int socket, const struct sockaddr *address, socklent address_len);
- 设置socket为监听模式 int listen(int socket, int backlog);
- 接收连接 int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);
- 数据读写 以下函数均可读取 Socket 数据:read(2)、recv(2)、recvfrom(2)和 recvmsg(2)。相对应的 write(2)、send(2)、sendto(2)和 sendmsg(2)都可以发送数据到 Socket。