1.协议
一组规则
2. 分层模型结构
2.1 OSI七层模型:物、数、网、传、会、表、应
TCP/IP 4层模型:网(链路层/网络接口层)、网、传、应
应用层 | http ftp nfs ssh |
---|---|
传输层 | tcp udp |
网络层 | ip icmp igmp |
链路层 | 以太帧协议 ARP |
3.通信模型
C/S模型
client–server
B/S模型
brower–server
C/S | B/S |
---|---|
优点:缓存大量数据,协议选择灵活 | 优点:安全性、跨平台、开发量小 速度快 |
缺点:安全性、跨平台、开发量小 | 缺点:不能缓存大量数据,严格遵守http |
4.网络传输流程:
数据没有封装之前,是不能在网络中传递
5.以太网帧协议
根据ARP协议,根据IP地址获取MAC地址
6、IP协议
版本:ipv4 ipv6 ----4位
TTL: time to live。设置数据包在路由节点中的跳转上限。每经过一个路由节点,该值-1.减为0的路由,有义务将该数据包丢弃
源ip:32位---4字节 192.168.1.25---点分十进制 ip地址(string)---二进制
目的ip:32位---4字节
ip地址:可以在网络环境中,唯一标识一台主机
端口号:可以网络的一台主机上,唯一标识一个进程
ip地址+端口号:可以在网络环境中,唯一标识一个进程。
7.UDP
16为:源端口号 65535
16位:目的端口号
8、TCP
16位:源端口号 65535
16位:目的端口号
32序号
32确认序号
6个标志位
16窗口大小。
9.网络套接字:socket
一个文件描述符指向一个套接字(该套接字内部由该内核借助两个缓冲区实现)
在通信过程中,套接字一定是成对出现的。
10.网络字节序:
小端法(PC本地存储):高位存高地址,地位存低地址
大端法(网络存储):高位存低地址,低位存高地址
htonl -->本地–》网络(ip)
192.168.1.28–>string–>atoi–>int–>htonl–>网络字节序
htons–>本地–》网络(端口)
ntohl–>网络–》本地(ip)
ntohs–>网络–》本地(port)
ip地址转换函数
int int_pton(int af, const char *src, void *dst)
af:AF_INET\AF_INET6
src:传入,ip地址(点分十进制)
dst:传出,转换后的网络字节序的ip地址
返回值:
成功:1
异常:0,说明src指向的不是一个有效的ip地址
失败:-1
作用:本地字节序(string ip)----》网络字节序
const char *inet_ntop(int af, const void *src, char *dst socklen_t size)
af:AF_INET\AF_INET6
src:网络字节序IP地址
dst:本地字节序(string ip)
size:dst的大小
返回值:
成功:dst
失败:NULL
作用:网络字节序–>本地字节序(string ip)
11.sockaddr地址结构
struct sockaddr_in addr;
addr.sin_family = AF_INET\AF_INET6
addr.sin_port = htons(9527);
int dst;
inet_pton(AF_INET, “192.168.22.152”, (void *)&dst)
addr.sin_addr.s_addr = dst;
或者
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(fd, (struct sockaddr *)&addr, size);
ANADDR_ANY:取出系统中有效的任意IP地址,二进制类型。
socket函数
#include<sys/socket.h>
int socket(int domain, int type, int protocol)创建一个套接字
domain:AF_INET\AF_INET6\AF_UNIX
type:SOCK_STREAM、SOCK_DGRAM
protocol:0
返回值
成功:新套接字所对应的文件描述符
失败:-1 error
int bind (int socket, *const struct sockaddr addr, socklen_t addrlen);
给socket绑定一个地址结构(ip+port),绑定的自身建立连接的那个地址结构
sockfd:socket函数返回值
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(7660);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr:(struct sockaddr *)&addr
addrlen:sizeof(addr)地址结构的大小
返回值:
成功:0
失败:-1 error
int listen(int sockfd, int backlog);
设置同时与服务器建立连接的上限数(同时进行3次握手的客户端数量)
sockfd:socket函数返回值
backlog:上限数值,最大是128
返回值:
成功:0
失败:-1 error
int accept (int sockfd, *struct socketaddr addr, socklen_t *addrlen)
阻塞等待客户端建立连接,成功的话,返回一个与客户端连接的socket文件描述符
sockfd:socket函数返回值
addr:传出参数。成功与服务器建立连接的那个客户端的地址结构
socklen_t cliet_addr_len=sizeof(addr);
addrlen:传入传出 &cliet_addr_len
入:addr的大小 出:客户端addr实际大小
返回值:
成功:能与服务器进行数据通信的socket对应的文件描述
失败 -1 ,error
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
使用现有的socket与服务器建立连接。
sockfd:socket函数返回值
addr:传入参数。服务器的地址结构
addrlen:服务器的地址结构的大小
返回值:
成功:0
失败 -1 ,error
如果不适用bind绑定客户端地址结构,采用“隐式绑定”