体系结构
客户端-服务器(C/S)
http
P2P
混合结构
- Napster:文件传输p2p;文件搜索c/s
网络应用进程通信
- 不同主机上的进程:消息交换(报文交换)
- 客户机进程:发起通信请求的进程
- 服务器进程:等待通信请求的进程
- p2p架构中也有客户机进程服务器进程
Socket 套接字
使用下层提供的服务TCP,关于网络编程的API:传输协议的选择,参数的设置
寻址进程
进程的标识问题
- 标示主机:IP地址 唯一的标示一台主机
- 主机上每一个进程:端口号,有些是已经约定的 http:80 mail:25 0-65536
- 进程标识符:IP地址+端口号
应用层协议
去RFC文档查找详细的协议
- 公开的协议:http
- 私有的协议:许多p2p
内容
- 消息类型:请求消息,响应消息
- 消息格式(语法)
- 字段的语义
- 规则:何时 如何
需求
- 数据丢失/可靠性
- 时间/延迟
- 带宽
Internet提供的服务
两个:TCP UDP
Web应用
- 对象
- 对象的寻址:URL 协议(scheme)?/host:port/path
http
- C/S结构:浏览器,服务器(web server)如Apache(阿帕奇)
- TCP 80端口
- 无状态 不维护任何有关客户端过去请求的信息
连接类型
- 非持久性链接 1.0版本
- 持久性链接 1.1版本 连续传输多个对象
- 无流水的持久性连接:客户端收到前一个响应后才能发送新的请求
- 带有流水机制的持久性连接 1.1默认
响应时间分析
- RTT往返时间
- 响应时间:发起建立连接 1 发送http请求 响应消息前几个字节到达 1 响应消息中所含文件/对象的传输时间
消息格式
头部行是可扩展的
请求消息
ASCII:人直接可读
- 请求行:请求方法 URL HTTP版本
- 头部行:主机地址,客户端浏览器,连接,接受的语言,
- 携带数据:用户名,密码之类的
上传输入
- POST:表格
- URL方法:GET 信息比较少,可以放到request行的url里 ?username&password
HTTP 1.0:
- GET
- POST
- HEAD:不要把请求的对象放到响应消息中
HTTP 1.1:
- HTTP 1.0
- PUT
- DELETE
响应消息
- 状态行:版本 状态码
- 头部行
- 空行
- 数据
Cookie技术
HTTP的消息中加入cookie头部行
web缓存/代理服务器 proxy server
在不访问服务器的前提下满足客户端的http请求
- 缩短响应时间;减少机构/组织流量;大范围内有效内容分发
- 条件GET:最新版本,版本一致
Email应用
- SMTP,邮件服务器,客户端
- 异步应用
- 邮件服务器:email的核心
- 邮箱,消息队列
SMTP
- 响应模式:命令/响应
- 格式:
- 头部行:
- 消息体:
- MIME 多媒体邮件扩展
- 在邮件头部增加额外行
邮件访问协议
- POP:认证/授权 下载
- IMAP:更多功能,复杂,操纵存储消息
- HTTP:基于Web的Email
POP3
- 认证过程
- 事务阶段
- 模式:下载并删除,下载并保持
- 无状态
IMAP
- 有状态
DNS
互联网的核心服务
域名系统
互联网上主机/路由器的识别问题
两套:
IP地址
数字
域名
www.baidu.com 好识别
域名解析系统 DNS
IP与域名的映射,完成域名的解析
- 分布式数据库
- 应用层协议(有应用层软件)
- 在应用层实现的
服务
- 负载均衡:Web服务器 提供多个服务器的地址,轮流
- 翻译
- 主机别名
分布式层次式数据库
- 根域名服务器 13个
- 顶级域名服务器(TLD) .com .org .edu .cn 国家
- 权威域名服务器:组织,解析内部的
- 本地域名解析服务器:不严格属于层级体系,每一个ISP都有:客户发给本地域名服务器,本地域名服务器作为代理
查询过程
想获得IP地址-迭代查询:
- 访问本地域名服务器-根域名-顶级域名
- 本地-顶级-权威
- 本地-权威-IP地址
- 本地-主机
递归查询:
- 本地-根-TLD-权威-TLD-根-本地
缓存&更新
- 本地域名服务器会缓存TLD的映射
记录&消息格式
- 资源记录 RR:四元组
- 协议:查询恢复协议,格式是一样的
- 消息头部:16位查询编号,回复相同
如何注册域名
- 域名管理机构申请注册:提供名字 IP地址;管理机构插入两条记录
P2P
- 动态更换IP地址
- 节点阶段性接入
BitTorrent 文件传输
- 查询邻居chunk 同时发送chunk
- tit for tat
- 上传速率高就能找到更好的交易伙伴
索引技术
- 信息到节点位置(IP+ 端口号)
- 文件共享。即时消息
Napster 集中式索引
- 中央目录服务器
- 单点失效/性能瓶颈/版权
洪泛式查询 Query flooding
- 完全分布式
- 节点只对自己有的文件检索
- 覆盖网络:TCP-边-覆盖网络
- 转发查询消息
- 查询命中:反向路径
- 网络负担
层次式覆盖网络
- 超级节点 普通节点
- 超级节点之间是洪泛的
- Skype:私有应用层协议
Socket编程
- 应用编程接口 API
开发网络应用程序
针对端系统,用户使用的主机,不包括路由器等
- 面向网卡编程:硬件
- 面向 Packet Driver 几乎针对所有网卡:直接面向数据链路层
- NDIS Windows , LibPcap等等函数库
- NetBIOS :会话层
- 应用层传输层之间:套接字
- 基于Web开发/中间件编程:应用层之上
应用编程接口 API
-
应用层协议:应用进程的信息交互
-
应用进程和底层的接口:API
-
API:系统调用的接口 应用进程控制权和操作系统控制权转换
-
经典API:套接字(伯克利socket),WINSOCK,TLI传输层接口
Socket API
- 面向BSD
- 面向TCP/IP协议栈,提供接口
- 目前:网络应用的工业标准,绝大多数操作系统都支持,最常用,通信模型(C/S)
- 连接在传输层协议上的端口
- 端口号:对应的哪一个套接字
- IP地址:主机上的进程
- 操作系统/进程 :套接字描述符
- 文件的抽象
- 端点地址:IP+端口号
- sockaddr_in IP+端口号 地址族:可以面向各种协议栈
WINSOCK
- WSAStartup(版本,WSADATA(实际提供的版本号))开始调用
- WSACleanup(void) 最后调用,解除绑定释放资源
- socket(协议族,套接字类型,协议号=0) 创建套接字
- TCP:流式套接字SOCK_STREAM UDP:报问套接字SOCK_DGRAM 还有SOCK_RAW直接面向网络层
- Closesocket(套接字描述符) 关闭套接字,不一定关闭套接字的数据结构
- bind(套接字描述符,端点地址,)绑定套接字本地端点地址 IP+端口号
- listen(sd,queuesize)
- connect()只用于客户端
- accept() 服务器端只用于TCP
- 等