《计算机网络——自顶向下方法》读书笔记,第二章、应用层

《计算机网络——自顶向下方法》读书笔记,第二章、应用层

一、应用层协议概述

这一章主要是讲的应用层的相关内容(这不是废话么,题目都写着了),作为网络结构的最顶层,它上面主要定义的就是程序和传输层之间的内容。也就是它描述了在一台计算机上,一个软件如何把信息传入互联网,又如何从互联网上获取其他主机传输的信息。

另外对于互联网应用程序来说,主要两种体系结构。

  • 第一种是客户——服务器体系结构,这种结构我们普通的都作为客户,而我们电脑上的应用程序上网都是相当于向服务器发送指令,获取相关的反馈。比如:浏览网页就是相当于从服务器获取网页文件,然后使用我们本地的浏览器软件对网页文件进行解释说明,然后呈现在我们的面前;再比如发送邮件,就是我们本地的程序向某一个服务器发送我们的邮件,然后服务器存储或者根据邮件地址发送到其他的服务器上面,另一个人接收邮件的过程则是,从对应的服务器下载之前存储的邮件的过程。
  • 第二种是:P2P体系结构,这种结构简单来说就是让每个人都尽量的对等,共同来分担信息传输的压力,而且有很强的自扩展性,但是对于安全性也有很大的挑战。共享是它的核心。

二、 套接字

程序员写的应用程序如何和互联网上的其他应用程序交互呢,这里首先应用程序生成一个进程,这个进程就是将需要传输的信息通过一个叫做套接字的接口传输到运输层,进而进一步传输到其它层。因此套接字也称作“应用程序和网络之间的应用程序编程接口API”,作为应用程序的开发者,对于运输层,我们只能选择使用哪一个运输层协议,另外传递几个限制参数。

这里用发邮件为例,为了表示接收进程,需要定义两个信息:1.主机的地址(ip);2.在目的主机中指定接收进程的标识符(端口号)。

三、运输协议 TCP & UDP

因特网为运输层提供两个协议,就是UDPTCP,注意这里的两个协议是运输层协议。这一部分简单的描述一下,后面在运输层会具体讲。

1.TCP

TCP连接提供两个服务:面向连接服务可靠数据传输服务

  • 面向连接服务:在应用层数据报文流动之前,TCP首先让客户和服务器进行握手并建立TCP连接。包括交换运输层的控制信息。注意:TCP连接可以看成是两个进程的套接字之间的连接。
  • 可靠数据传输服务:它保证了发送进程流进套接字里面的信息,可以完全的没有遗漏的传输到接收进程的套接字里面。

2.UDP

UDP是一种不提供不必要服务的轻量级运输协议,它不建立连接。UDP协议传输的信息不保证每一个报文一定按照发送顺序到达接收端,也不保证每一个报文都能到达接收端。

四、5种重要的应用以及应用层协议

关于应用层协议定义了什么:

  • 交换的报文类型,例如请求报文和响应报文。
  • 各种报文类型的语法,如报文的各个字段及这些字段是如何描述的。
  • 字段的语义,即这些字段中的信息的含义。
  • 确定一个进程何时以及如何发送报文,对报文进行响应的规则。

注:在我理解的,协议即为标准,也就是用何种方式来把一段01序列和我要表达的信息进行相互转换,还有用什么顺序发送和回复信息。

1.Web

  • 什么是Web?

Web页面就是我们平时访问的各种网页。我们看到的网页是由很多个文件(包括比如:HTML文件,JPEG图形等)组合到一起,然后由Web客户端(网页浏览器)进行合并和解释,再呈现给我们,就是我们看到的样子了。这里插一句关于URL,URL定义每个对象(文件)在哪,它由两个部分组成:存放对象的主机名 + 对象的路径名。

  • 什么是HTTP协议?

HTTP叫做超文本传输协议,我们访问网页的过程,也就是向服务器的Web服务端程序发送请求让它把网页文件发过来我们再用浏览器来查看的过程。HTTP协议也就定义了:Web客户端和Web服务器交互的方法。

  • HTTP的连接

HTTP使用TCP连接,并且默认选择持续连接,但是客户端和服务器也可以手动配置成使用非持续连接。下面分别说明两个连接的步骤。
(1)非持续连接
第一步:客户发起TCP连接。
第二步:客户发送HTTP请求报文,请求文件。
第三步:服务器将文件封装,发送对应的响应报文。
第四步:服务器确认客户完整收到文件后,通知进程断开TCP连接。
第五步:客户收到响应报文,TCP连接关闭。
第六步:客户对于收到的文件中包含的每个URL地址重新进行前4个步骤。
(2)持续连接
显然就是建立完成TCP连接之后不断开,持续的进行文件的传输,直到客户接收完整个页面或者一段时间内TCP没有被使用,则断开TCP连接。缺点是可能会对服务器造成较大的负担,因为TCP连接可能会过多。

  • HTTP报文格式

(1)请求报文
它一共由三个部分组成,第一行叫请求行,有三个字段:方法字段、URL字段、HTTP版本字段。后面若干行是首部行,这里有很多可选的选项,每一个选项的格式都是,首部字段名:sp 值 cr lf,他们可以描述请求的各种规则,比如是否采用持续连接,浏览器的类型等等。后面是一个空行,最后是实体体,这个是POST方法提交表单时使用的,使用GET方法时实体体为空。
(2)响应报文
它也有三个部分:状态行,首部行,实体体。首先状态行有三个字段:协议版本字段、状态码、相应状态信息。首部行也是若干行返回各类信息。最后的实体体就是完整的被请求的数据了。关于状态码:200 OK即为请求成功,404 Not Found表示被请求的文档不在服务器上等等(所以404刷新也没用啦)。

  • cookie

以前我们清理浏览器垃圾的时候,有时候有一个选项就是cookie,那么这个cookie是什么呢?举个例子,我们在没有登录淘宝账号的时候,也可以在网页上面看到喜欢的商品,也可以放到购物车里。但是按照我们之前的理论,我们放到购物车里的信息怎么能被保存呢,即使是缓存到了远端的服务器中,那服务器又怎么能知道我是我呢?换一句话说,我第二次向服务器提交请求报文的时候,服务器怎么确定我是之前那个把商品加入了购物车的客户呢。这里就有一个巧妙地办法了,就是服务器在返回响应报文的时候,顺便加入一个标识码,我在第二次访问的时候,在请求报文中加入这个标识码,这样服务器再次收到的时候,就知道我是我了。这样服务器也就可以跟踪用户了。

  • Web缓存

Web缓存器也叫代理服务器,代理服务器可以存储最近被访问过的网页,这样每次HTTP请求先到代理服务器上,如果代理服务器有所请求的页面则直接返回响应报文,否则,去初始服务器请求该页面,并备份,再返回响应报文。另外为了保证缓存的页面是最新的,可以使用条件GET方法

2.文件传输

3.电子邮件

电子邮件我们应该都使用过,电子邮件系统由三个主要的部分组成:用户代理邮件服务器简单邮件传输协议(SMTP)
这三者之间的关系是这样的:用户代理将客户的邮件发送给自己的邮件服务器A,邮件服务器根据邮件的收件地址,不断的将邮件向邮件服务器B发送,直到发送成功。而这个传输的格式,也就是简单邮件传输协议来规定的。

  • SMTP(邮件传输协议)

    SMTP是因特网电子邮件的核心。SMTP用于从发送方的邮件服务器发送报文到接收方的邮件服务器。下面简单描述一下一个场景(Alice发送给Bob一个)简单的ASCII报文。来说明SMTP的基本操作。

    1. Alice调用他的邮件代理程序,提供Bob的邮件代理,指示用户代理发送报文。
    2. Alice的用户代理吧报文发送给Alice的邮件服务器,邮件服务器把报文放进队列。
    3. Alice的邮件服务器上面运行的SMTP客户端发现了报文队列中的报文,客户端创建一个进程对Bob邮件服务器上的SMTP服务器的TCP连接。
    4. SMTP两端确认身份,然后通过TCP发送信息。
    5. Bob邮件服务器上的SMTP把收到的报文放在Bob的邮箱中(也是在Bob的邮件服务器中)。
    6. Bob调用用户代理阅读报文

    我们可以注意到,这个过程中不通过中间邮件服务器发送邮件,所以就不会有邮件存留在其他的服务器中,保证了信息的安全性。另外SMTP使用的是持续连接,如果邮件服务器有多个报文发往另一个邮件服务器,则他们可以通过同一个TCP连接来完成。

    对比HTTP和SMTP:都是发送信息的协议,一个是用Web服务器,一个是邮件服务器;一个是去申请信息,一个是把信息扔过去;一个是任意二进制数据,一个必须是7比特ASCII码。

    另外还有一些比较繁琐的邮件报文格式描述,这里就不仔细说了,大概是分成了首部等等的各种部分。

  • 邮件访问协议

    这一部分,本来在书中是一小部分,但是第一次读的时候,就是因为这一段被弄得思路很乱,为什么上面说了协议下面还有这么多协议?所以这里单独拿出来和SMTP并列来说。先来解答他们之间的关系,SMTP是邮件传输协议,也就是规定了邮件怎么从一个服务器发送到另一个服务器。下面这一栏中说的协议叫做邮件访问协议,他们规定的是,已经发送到Bob邮箱中的报文,Bob如何在自己的设备上访问这个报文。

    1. POP3(Post Office Protocol - Version 3)

      超级简单的一个协议,功能有限,有三个阶段:阶段一(特许):用户代理用明文发送用户名和口令,认证身份;阶段二(事务处理):这一阶段用户代理取回报文,同时还能标记删除;阶段三(更新):在客户发送了quit命令后,结束会话,邮件服务器删除被标记删除的内容。

      注:POP3并不在会话中携带状态信息。

    2. IMAP(Internet Mail Access Protocol)

      一种更复杂的访问协议,可以有更高的自由度,比如获取一部分某个文件,可以远程访问,避免占用很大的本地空间。不仔细讲了,用到再看就可以。

    3. HTTP

      简单来说就是用现有的HTTP协议,直接把邮件拉过来,然后随便怎么浏览。

4.目录服务(DNS)

因为最近想自己搭建一个网站,所以对于这方面多进行了一些了解。

我们在浏览器中输入网址实际上是输入的我们要访问的服务器主机的名字(主机名),但是因为计算机更希望处理定长的数据,所以我们希望有一种方式可以把主机名和一串数字一一对应,这也就是我们常说的IP地址

5.流式视频和P2P

五、编程实践(UDP & TCP)

UDP套接字

客户端代码:

# 导入套接字的包
import socket

HOST = '127.0.0.1'
PORT = 9999

# 客户端使用UDP时,首先仍然创建基于UDP的Socket,然后,直接通过sendto()给服务器发数据
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
    print('Please input your data:')
    InputData = input('> ')

    # 发送数据
    s.sendto(InputData.encode('gb2312'), (HOST, PORT))
    # 接收数据
    ReceiveData = s.recv(1024)
    print(ReceiveData.decode('gb2312'))

服务器端代码:

# 导入套接字的包
import socket

# 创建UDP的套接字
# 在本程序中的参数选择如下:
# socket(IPv4网络通信, 数据报套接字, UDP传输协议)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 客户端IP和端口号
HOST = '127.0.0.1'
PORT = 9999
s.bind((HOST, PORT))

# 循环接收Client数据
while True:
    # 利用recvfrom()方法获取数据和客户端的信息
    data, addr = s.recvfrom(1024)
    print("Received from %s: %s" % (addr, data.decode('gb2312')))
    s.sendto('I got it!'.encode('gb2312'), addr)

TCP套接字

发布了234 篇原创文章 · 获赞 159 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_36306833/article/details/104644887