socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我么们无需深入的去理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然遵循tcp/udp标准的。
socket
网络基础
网络应用程序设计模式
C/S - client/Server
- 优点:协议选用灵活、可缓存数据
- 缺点:对用户安全构成威胁、开发工作量大
B/S - browser/Server
- 优点:跨平台
- 缺点:只可以使用http
协议概念
- 规则:数据传输和数据解释的规则
- 典型协议:TCP、UDP HTTP FTP IP ARP
分层模型
OSI七层模型
物 – 双绞线, 光纤 物理层
数 – 数据的传输和错误检测 数据链路层
网 – 为数据包选择路由 网络层
传 – 提供端对端的接口 tcp/udp 传输层
会 – 解除或建立与别的节点的联系 会话层
表 – 数据格式化,代码转换,数据加密 表示层
应 – 文件传输,电子邮件,文件服务,虚拟终端 应用层
四层模型
协议格式
以太网帧
ip协议
UDP
TCP
数据发送与接受
TCP UDP传输层协议
socket
socket是网络通信的函数接口、封装了传输层协议;
套接字
服务端
文件(内核缓冲区)操作
socket tcp server
创建套接字
- int lfd = socket();
绑定本地IP和端口
- struct sockaddr_in serv;
- serv.port = htons(port);
- serv.ip = hontl(INADDR_ANT);
- bind(lfd,&serv,sizeof(serv));
监听
- listen(lfd,128); //最大同时连接到我的个数
等待连接请求
- struct sockadd_in client;
- int len = sizeof(client);
- int cfd = accept(lfd,&client,&len);
- cfd用于通信;
通信
- 接收输入:read/revc
- 发送数据:write/send
关闭
- close(lfd);
- close(fd);
客户端
- 创建套接字
- int fd = socket();
- 链接服务器
- struct sockaddr_in server;
- server.port
- server.ip = int;
- server.family
- connect(fd,&server,sizeof(server));
- 通信
- 接收输入:read/revc
- 发送数据:write/send
- 断开
- close(fd);
三次握手
标志位:
标志位:
- SYN: 请求建立连接
- ACK: 应答
- FIN: 断开连接
连接需要三次握手:
第一次握手:
客户端
携带标志位: SYN
随机产生32为序号: 1000
- 可以携带数据()
服务器:
- 检测SYN值是否为1
第二次握手:
服务器:
ACK 标志位 + 确认序号
- 客户端随机序号+1
发起一个连接请求
SYN+32随机序号
- 2000
客户端:
- 检测标志位: 1
- 校验: 确认序号是否正确
第三次握手:
客户端:
发送确认数据包
ACK+确认需要
- 服务器的随机序号+1
服务器:
- 检测: ACK是否为1
- 检验: 确认序号是否正确
四次挥手
第一次挥手:
- 客户端:
○ 发送断开连接的请求
§ FIN + 序号
§ ACK + 序号
○ server:
§ 检测FIN值是否为1
§ ack的作用告诉对方之前发的数据
收到了多少
第二次挥手:
○ 服务器:
§ 给client确认数据包
□ ACK + 确认编号
® FIN对应的序号+1+携带数据大小
○ 客户端:
§ 检测: ack值
§ 检测确认序号
第三次挥手:
○ 服务器端:
§ 发送断开连接的请求:
□ FIN+序号
□ ACK + 序号
○ 客户端:
§ 数据检测
滑动窗口
socket编程
client
1 |
|
server
1 |
|