网络应用是计算机网络存在的理由,没有了应用也不存在任何的网络协议。我们学习网络应用的原理和实现方面知识,从定义应用层概念开始,其中包括网络服务、客户】服务器、进程和运输层接口。
其中包括我们熟悉的web、email、dns等。
网络应用程序核心是能够在不同端系统和通过网络彼此通信的程序。像web应用程序,一个运行在web服务器主机,一个运行在用户主机上的浏览器程序。并且不需要关心下面层次的程序软件。
应用程序体系结构由开发者设定,规定了如何在不同端系统上组织应用程序,当前两种主流的体系结构:客户-服务器体系结构(C-S)和对等(P2P)体系结构
客户服务器体系结构:一个总是打开的主机称为服务器,它服务于许多其他主机的请求称为客户。客户向服务器发起请求,服务器向客户发送响应,客户之间没有通信。服务器必须有固定的IP地址。
P2P体系结构:应用程序在间断连接的主机之间直接通信没有专门的服务器。如电话会议、视频等。每个主机被称为对等方。每个对等方既可以请求数据也可以服务其他对等方。
两个不同端系统之间的应用程序之间通信起始就是两个进程之间的通信,跨越计算机网络交换报文而进行通信。发送进程向网络发送报文,接收进程接收报文并且回应。
客户和服务器进程:网络应用程序由成对的进程组成,如web应用程序由客户端的客户浏览器进程与web服务器端进程。对于P2P来说下载文件端是客户端,上传文件端是服务端。所以我们定义:发起通信的进程被标识为客户。会话开始等待连接的进程为服务器。
计算机网络与进程之间的接口:进程通过套接字来实现软件接口向网络发送博文和接收报文。如socket套接字。
进程寻址:发送报文需要目的地址,所以需要两种信息:1.主机地址也就是IP地址。2.目的主机中的接收进程,也就是端口号。
套接字是应用进程和运输层协议之间的接口,在套接字的另一侧,运输层协议负责从接收进程的套接字得到报文。运输层可以提供什么服务呢?
可靠的数据传输:确保应用程序发送的数据准确无误地交付给另一端
吞吐量:以某种特定速率提供确保的可用吞吐量。可用吞吐量:发送进程能够向接收进程交付比特的速率。
定时:如超时重传机制
安全性:对发送进程的数据进行加密传输,在接收方进行解密
因特网为应用层提供了两个运输层协议:TCP和UDP
1. TCP:TCP服务提供面向连接服务和可靠数据传输服务。
面向连接:应用层数据报文在开始前,tcp让客户和服务器相互交换运输层信息。也就是三次握手。
可靠的数据传输服务:可以无差错、按适当顺序交付所有发送的数据。没有字节丢失和冗余。
拥塞控制:当发送方和接收方之间网络出现了阻塞的时候,TCP的拥塞控制会抑制发送进程和限制tcp连接。
2. UDP:不提供不必要服务的轻量级运输协议。没有握、不可靠数据传输、没有拥塞控制。
应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文。应用层协议是网络应用的一部分,例如web应用层协议是http,电子邮件的应用层协议是smtp。应用层协议定义了:
交换的报文类型:请求报文和响应报文
各种报文类型语法:报文中各个字段如何描述的
字段的语义:字段中的信息含义确定一个进程何时以及如何发送报文,对报文进行响应规则。
HTTP:web的的应用层协议:超文本传输协议。hrrp定义了web客户向web服务器请求web页面的方式,以及服务器向客户传送页面的方式。
web页面由对象组成,一个对象表示一个文件,多数web页面由一个HTML基本文件和多个对象组成。HTML基本文件通过对象的URL地址引用页面中的其他对象。
3URL由两
分组成,存放对象的服务器主机名和对象的路径名。
HTTP使用tcp作为它的运输协议。http客户首先发起一个与服务器连接的tcp请求,一旦建立连接,浏览器和服务器就可以通过套接字来访问tcp,客户端向套接字发送请求和接收响应。
非持续连接:每个tcp连接在服务器发送一个对象之后就关闭,连接不为其他对象而持续。当有多个对象时候就会产生多个连接。
持续连接:HTTP1.1,服务器发送响应之后保持该连接,后续的请求和响应可以通过相同的连接进行传送。
1.HTTP报文格式
客户端请求报文:请求行(request line)、首部行(header)、空行和请求数据四个部分组成,
GET /hello.txt HTTP/1.1
Host: www.example.com
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Connection:close
Accept-Language: en, mi
第一行:请求行:方法字段(get)+ URL字段(/hello.txt)+ HTTP版本字段(HTTP/1.1)。其中方法字段可以是 get、post、head、put、delete。
后继的行:首部行:host:指主机
Connection:close:表示服务器不使用持续连接。
User-Agent:用户代理,指服务器发送请求的浏览器类型。
Accept-Language:用户想要对象的语法版本
如图:
2.服务器端响应报文:状态行、首部行、空行和响应正文四部分组成。
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 51
Content-Type: text/plain
第一行:状态行:版本号+状态
后继的行:首部行:Connection:close:发送完报文之后关闭tcp连接
Date:服务器产生并发送报文的时间
Server:指报文由Apache服务器产生
Last-Modified:指最后一次修改时间
Content-Length:发送对象的字节数
Content-Type:发送数据类型
3.cookie:用户与服务器之间的交互,用于标识客户,将内容与客户身份联系起来
cookie的四个组件
http请求报文中的一个cookie的首部行
http响应报文中的一个cookie的首部行
web站点的一个后端数据库
用户端系统中保留的cookie文件
cookie使用:当客户端首次连接服务器时候,服务器将产生一个唯一的标识码,通过响应头部包含一个Set-cookie:1666 的首部传送给客户端,客户端收到之后保存在本地文件,在之后放服务端,都会在请求报文的首部行加入cookie:1666 。HTML基本文件通过对象的URL地址引用页面中的其他对象。
cookie作用:服务器可以知道客户端在什么时间做了什么,就像我们逛淘宝一样,将各种东西加入购物车,服务端维护我们的物品列表,最后一起付款一样。
3.web缓冲
web缓冲区也叫代理服务器,它能够代表初始web服务器来满足http请求的网络实体。它有自己的缓冲区,存储最近请求过对象的副本。web缓冲器既是服务端又是客户端。
工作流程:当浏览器向服务端发起一个对象请求时,web缓冲区先看自己缓冲区有没有该对象,如果有就返回给浏览器,如果没有则向服务器请求,服务器返回时浏览器将保持副本,并且返回给客户端。
作用:
1.web缓冲区可以大大减少请求时间。
2.大大减少一个机构接入链路到因特网通信量,
3.大大减少因特网的web流量。
4.条件GET方法
上面说的web缓冲区可以减少请求时间,但是如果服务器端对象以及更改,那么缓冲区的对象就是陈旧的,因此http有个机制,允许缓冲区证明对象是最新的,这个机制就是条件get。
1.电子邮件系统由三部分组成:用户代理、邮件服务器、简单邮件传输协议(SMTP)。
2. 使用tcp可靠数据传输服务
3.邮件服务器即运行SMTP客户端也运行SMTP服务端,当发送邮件时变为客户端,当接收文件时表现为服务端。
1.SMTP:SMTP用于从发送方的邮件服务器发送报文到接收方的邮件服务器。
SMTP如何将报文从发送邮件服务器发送到接收服务器:客户SMTP在端口号25建立一个与服务器连接的tcp连接,如果服务器没有开则稍后重试,如果开了则建立连接、握手,如何客户端发送报文。
SMTP与HTTP区别:
相同点:都是从一台主机到另一台主机发送报文。持续的http和smtp都是持续连接的。
不同点:
1.http主要是拉协议,从服务器拉取资源。smtp是推协议,发送端向服务器推送资源。
2.smtp报文采用7比特ASCII码格式,http没有限制
3.http把每个对象封装在自己的HTTP响应报文中,而SMTP则把所有报文放在一个报文中。
2.邮件访问协议
现在的邮件访问使用的是 客户-服务器体系结构,用户通常在本地运行一个用户代理程序,而他访问存储在总是开启的共享邮件服务器上的邮箱。下面是三种当今流行的邮件访问协议
POP3:第三版邮局协议:POP3是一个简单的邮件访问协议,将邮件从接收方服务器传送到接收方的用户代理。
工作流程:
1.特许:用户代理发送用户名、口令以及鉴别用户
2.事务处理:用户代理取回报文,同时进行阅读、删除等做标记操作
3.更新:删除邮件服务器被标记的报文
IMAP:因特网邮件访问协议:当邮件到达服务器时候,自动与接收者的文件夹相关联。为用户提供了远程文件夹。
基于web的电子邮件:用户与远程邮箱通过http进行
DNS:域名系统:能够进行主机名到IP地址转换的目录服务,dns由一个分层的DNS服务器实现的分布式数据库,dns一个使得主机能够查询分布式数据库的应用层协议。
DNS运行在UDP之上。端口号53.
DNS通常由应用层其他协议使用。
DNS提供的服务:1.域名解析,2.主机别名、邮件服务器别名、负载分配。
DNS工作机理:一台主机上运行着DNS服务器,浏览器访问一个主机,将主机名发送给DNS应用客户端,然后DNS客户端向DNS服务器发起请求,服务端解析主机名的IP地址,
然后客户端接收到服务端带有IP地址的响应报文,然后浏览器收到DNS发送来的IP地址并访问。
分布式、层次数据库:DNS使用了大量DNS服务器,他们以层次方式组织起来分布在全世界,因特网上所有主机映射在这些服务器中。大致分为三种服务器:根DNS服务器、顶级域DNS服务器、权威DNS服务器。如图
首先如果客户想要访问baidu.com,客户首先与跟服务器进行联系,跟服务器返回顶域名com的TLD服务器,然后客户与TLD服务器联系,TLD服务器返回baidu.com的权威覅我去,最后客户与权威服务器联系,将baidu.com的IP地址返回客户。
根DNS服务器:由13个不同组织管理着400多个根服务器 ,根服务器提供TLD服务器的IP地址。
顶级域DNS服务器:每个顶级域名(com、edu、cn、net)和所有国家的顶级域名(uk、ca)都有TLD服务器。
权威DNS服务器:权威DNS 服务器保存了一个组织机构可提供公共可访问的DNS记录。
本地DNS服务器:不属于DNS服务器层次机构,但是对DNS层次结构至关重要。它起着代理作用,将主机请求发往DNS服务器。
DNS缓冲:为了减少在因特网上传输的DNS数量。作用机理如图web缓冲区。
DNS记录和报文:
记录:共同实现DNS分布式数据库的所有DNS服务器存储了资源记录,这些资源记录提供了主机名和IP地址的映射。每个DNS回答报文包含了一条或多条资源记录。资源记录包含以下4个字段:
(NAME、Value、Type、TTL)其他TTL是记录的生存时间,name和value的值取决于Type:
TYPE=A:name是主机名,value对应IP地址。
TYPE=NS: names域名,Value对应域中主机IP地址的获取该权威DNS服务器主机名。
TYPE=CNAME: names是主机名,value是对应的规范主机名。
TYPE=MX: names是别名,value是邮件服务器的规范主机名
前12个字节是首部区域:标识符:16比特,用于表示查询。该标识符会被复制到查询的回答报文中。
标志:1比特的查询(0)/回答(1)。1比特的权威服务器标志。1比特的递归查询。
4个数:表示首部后面4类数据区域出现的数量
在DNS数据库中插入记录:当注册一个域名时,需要向注册机构提供权威DNS服务器的名字和IP地址,然后注册机构 将记录输入顶级域名服务器。
P2P文件发布:单一服务器向大量对等方发送文件。每个对等方可以向其他对等方重新发送它所受到的文件任何部分,从而在发送过程中协助服务器。
1.P2P体系结构的扩展性:P2P体系结构中的每个对等方都可以帮助服务器分发该文件,特别是当每个对等方接收到某些文件数据时它可以使用自己的上载能力将数据发送给其他对等方。
2.BitTorrent:P2P的文件分发协议。参与一个文件分发的所有对等方集合被称为洪流。洪流中的对等方彼此下载等长度的文件块(一般是256k)。每个对等方首次加入洪流时没有块,随着时间它的块越来越多,等一个对等方具有块的子集时候,它就可以随时离开,或者留下为其他对等方传输。
1.视频:视频是一系列图像以恒定的速率(每秒30张图像)来展示,一张图像由像素阵列组成,每个像素是由一些比特编码来表示亮度和颜色。视频的一个特征是能够压缩,所以比特率是权衡视频质量。
2.HTTP流:存储在HTTP服务器中的一个普通视频文件,每个文件有特定的URL。
3.DASH:经HTTP的动态适应性流:视频编码有多个不同版本,每个版本的比特率不同, 对应的视频质量不同。
4.CDN:内容分发网:管理分布在各个地方的视频服务器。
1.UDP套接字编程:
服务器
创建套接字 socket( )
填充服务器网络信息结构体 sockaddr_in
将套接字与服务器网络信息结构体绑定 bind( )
进行通信 recvfrom( )/sendto( )
客户端
创建套接字 socket( )
填充服务器网络信息结构体 sockaddr_in
进行通信 sendto( )/recvfrom( )
2.TCP编程
服务器:
创建套接字 socket( )
填充服务器网络信息结构体 sockaddr_in
将套接字与服务器网络信息结构体绑定 bind( ) 固定自己的信息
将套接字设置为被动监听状态 listen( )
阻塞等待客户端的连接请求 accept( )
进行通信 接收数据recv( )/发送数据 send( )
关闭套接字close()
客户端:
创建套接字 socket( )
填充服务器网络信息结构体 sockaddr_in
发送客户端连接请求 connect( )
进行通信 发送数据 send( )/接收数据recv( )
关闭套接字close()
3.C语言实现socket套接字网络编程案例:
下面是我写的一篇巨详细的socket编程讲解
Linux操作系统下C语言网络编程