协议:
一组规则
分层模型结构:
- OSI七层模型: 物理层 数据链路层 网络层 传输层 表示层 应用层
- TCP/IP 四层模型:网(链路层/网络接口层),网,传,应
应用层:http.ftp,nfs,ssh,telnet
传输层:tcp udp
网络层:IP ICMP IGMP
链路层:以太网帧协议,ARP
- 网络传输流程:
数据没有封装之前,是不能在网络中进行传输的
- 以太网帧协议:
ARP协议:根据IP地址获取Mac地址
以太网帧协议:根据Mac地址,完成数据包传输
网络应用程序设计模式:
C/S模型 B/S模型:
优点:缓存数据,提高数据传输效率 优点:开发工作量小
协议选择灵活,可定制,可裁剪 安全性好,跨平台
缺点: 缺点:
开发工作量大 数据无法缓存
安全性差 只能采用固定协议
不能跨平台
IP协议:
版本:ipv4,ipv6-----4位
TTL:time to live 设置数据包在路由节点中的跳转上线,每经过一个路由节点,该值减1,减为0的
路由,有义务将该数据包丢弃
源IP:32位 -----4字节
目的ip: 32位 ------4字节
192.168.1.1-----点分十进制ip地址 -----二进制
IP地址:可以在网络环境中,唯一标识一台主机
端口号:可以在网络的一台主机上,唯一的标识一个进程
UDP:
16位:源端口号 2^16=65536
16位:目的端口号
IP:
16位:源端口号 2^16=65536
16位:目的端口号
32序号
32确定序号
6个标志位
16窗口大小
linux 函数API解析:
socket 地址结构:IP+port---->网络环境中唯一标识一个进程
struct sockaddr_in addr
addr.sin_family=AF_INET/AF_INET6 man 7 ip
addr.sin_port=htons(9527);
int dst;
inet_pton(AF_INET,"192.168.1.1",(void *)$dst);
addr.sin_addr.s_addr=htonl(INADDR_ANY); 取出系统中有效的任意iP地址,二进制类型
bind(fd,(struct sockaddr *)&addr ,size);
socket函数:
#include <sys/socket.h>
int socket (int domain,int type,int protcol); 创建一个套接字
domain :AF_INET AF_INET6 AF_UNIX
type: SOCK_STREAM SOCK_DGAM
protocol: 0
返回值:
成功:新套接字所对应的文件描述符
失败: -1 errno
int bind(int sockfd ,const struct sockaddr *addr,sokelen_t addrlen); 给socket绑定一个地
址结构(ip + port)
sockfd: socket函数返回值
struct sockaddr_in addr;
addr.sin_familu=AF_INET;
addr.sin_port=htons(8888)
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr: 传入参数(struct sockaddr*) &addr
addrlen:sizeof(addr)地址结构的大小
返回值:
成功: 0;
失败: -1 errno
int listen(int sockfd ,int backlog); 设置同时与服务器建立连接的上线数(同时进行3次握手的客户端数量)
sockfd: soket 函数返回值
backlog: 上线数,最大值 128
返回值:
成功: 0;
失败:-1;
int accept(int sockfd, struct sockaddr *addr,sockken_t *addrlen); 阻塞等待客户端建立连
接,成功的话,返回一个与客户端成功连接的socket文件描述符
sockfd: socket函数返回值
addr:传出参数 成功与服务器建立连接的那个客户端的地质结构(ip+port)
socketlen_t clit_addr_len=sizeof(addr)
addrlen: 传入参数 &clit_addr_len
入:addr的大小 出:客户端addr实际大小
返回值:
成功:能与服务器进行数据通信的socket对应的文件描述符
int connect(int sockfd,const struct sockaddr*addr ,socklen_t addrlen); 使用现有的
socket与服务器建立连接
sockfd:socket函数的返回值
addr :传入参数,服务器的地址结构
addrlen: 服务器的地质结构大小
返回值:
成功:0
失败:-1 errno
如果不使用bind绑定客户端地址结构,采用“隐式绑定”
server:
socket() 创建socket
bind() 绑定服务器地址结构
listen() 设置监听上线
accept() 阻塞监听客户端连接
read(fd) 读socket获取客户端数据
小---大写 toupper()
write(fd)
close()
client:
socket() 创建socket
connect() 与服务器建立连接
write() 写数据到socket
read() 读转换后的数据
显示读取的结果
close()
服务端代码:
客户端代码: