在传输层之上,便是应用层。传输层的UDP报文和TCP报文段的数据部分就是应用层交付的数据。
不同类型的网络应用有不同的通信规则,因此应用层协议都是多种多样的,比如DNS、FTP、Telent、SMTP、HTTP、RIP、NFS等协议都是用于解决其各自的一类问题。
DNS(域名服务)协议基于UDP,使用端口号53.
由数字组成的IP地址很难记忆,所以我们上网使用网站IP地址的别名——域名。实际使用中,域名与IP地址是对应的,这种对应关系保存在DNS服务器之中。
在浏览器中输入一个域名后,会有DNS服务器将域名解析为对应的IP地址。注意这和网络层的ARP协议的不同之处:DNS提供的是域名与IP地址的对应关系,而ARP提供的是IP地址与MAC地址的对应关系。
DNS服务器是个分层次的系统:
在Linux系统中,可以使用host命令进行DNS查询,查看一个指定域名的IP,比如要查询baidu.com
的IP地址:
host www.baidu.com
主机向DNS服务器发出的查询叫做DNS报文,问答报文的内容,都是IP和域名的对应信息,问题中包含域名、类型、类信息,回答中包含指针,类型,类,TTL,长度,IP地址信息。
之前DNS解析查询过程的图中,共发出了8分DNS报文,这是非常消耗时间的,所以实际应用中使用DNS缓存:当一个DNS服务器收到一个DNS回答后,会将信息缓存一段时间,当再有一个对相同域名的查询,便可直接回复。
通过DNS缓存,其实很多查询都只需要本地DNS服务器便可完成。
hosts文件可以看做是一个小型的DNS服务器。
使用命令打开hosts文件
sudo gedit /etc/hosts
查看文件内容,可以发现里面全是类似下图中的IP与域名对应记录;
在实际上网过程中,域名解析的优先顺序是:先在DNS缓存查询,若没有查到记录,再查询hosts文件,若还是没有找到记录,再向DNS服务器发出DNS查询报文。
我们可以用dig
命令进行域名查询
# 查询 www.shiyanlou.com 的 ip 地址, +noedns 是不显示edns信息`
dig www.shiyanlou,com +noedns
# 这一部分为应答的统计信息
- QUERY:查询任务个数,这里为1一个;
- ANSWER:查询到几条A记录(IP地址),这里为1条;
- AUTHOROTY:几个权威域名服务器,这里为0个;
- ADDITIONAL:几个附加信息,这里为0个。
# 这一部分为问题片段,意思是查询 www.shiyanlou.com的A记录
- ;; QUESTION SECTION
- ;www.shiyanlou.com
# 这一部分为应答片段,意为查询到的IP为121.40.227.60
- ;;ANSWER SECTION:
- www.shiyanlou.com. 587 IN A 121.40.227.60
# 这部分为查询的任务统计信息,比如查询花了多少时间,执行查询的时间等
- ;; Query time: 22 msec
下面用tcpdump来捕获DNS,首先执行命令:
sudo tcpdump -nt udp port 53
端口53是DNS服务器所开放的端口
此时还没有任何捕获信息,因为我们还没有进行DNS查询,可以使用host
命令进行域名查询,新开一个终端执行
host www.shiyanlou.com
得到输出
第一个数据包,是由本机向首选DNS服务器100.100.2.138
的53
端口发送的DNS查询报文,9909
是查询报文的标识值,+
代表启用递归查询标志。A?
表示使用A类型的查询方式。www.shiyanlou.com
为查询的域名,35
代表DNS查询报文的长度为35字节。
第二个数据包为应答报文,可看出标识值和第一个报文的标识值是一样的,1/0/0
表示报文包含1个应答资源记录,0个授权资源记录,0个额外信息记录。51
代表应答报文的长度为51字节。
后面的数据包同理。
我们也可以用
sudo tcpdump -nn -vvv -X udp port 53
查看以十六进制输出的报文内容:
对于第一个数据报,呈现的报文内容实际上是IP数据报,包含了IP首部,UDP首部和DNS报文。我们之前知道IP首部是20字节,即从4500
到028a
部分,UDP首部是8个字节,也就是bd52
到51d6
的部分,剩下的也就是DNS请求报文,一共35字节,与括号中的35相吻合。
其他数据包同理。
FTP协议基于TCP,使用端口号20
(数据)和21
(控制)。
它的主要功能是减少或消除在不同操作系统下处理文件的不兼容性。以达到便捷高效的文件传输效果。
我们直接下载一个FTP报文信息示例包ftp.pcap
,然后用tcpdump解析。
# 下载ftp.pcap文件
wget http://labfile.oss.aliyuncs.com/courses/98/ftp.pcap
# 然后用tcpdump命令解析
sudo tcpdump -r ftp.pcap
前面三帧是客户端与服务器的三次握手,连接服务器的ftp端口(21),客户端ip是192.168.0.114
,服务器ip是192.168.0.193
。
01:24:40.499548 IP 192.168.0.114.1137 > 192.168.0.193.ftp: Flags [S], seq 3753095934, win 16384, options [mss 1460,nop,nop,sackOK], length 0
01:24:40.501867 IP 192.168.0.193.ftp > 192.168.0.114.1137: Flags [S.], seq 3334930753, ack 3753095935, win 16384, options [mss 1452,nop,nop,sackOK], length 0
01:24:40.501886 IP 192.168.0.114.1137 > 192.168.0.193.ftp: Flags [.], ack 1, win 17424, length 0
第四帧时服务器向客户端发送相关信息:
01:24:40.503947 IP 192.168.0.193.ftp > 192.168.0.114.1137: Flags [P.], seq 1:31, ack 1, win 65535, length 30
此时控制连接建立完成。再下面的部分就是客户端向服务器端发送请求,然后服务器端响应客户端的过程,比如登录,输出所在路径等操作。
在后面的输出中,还能找到客户端与服务器端建立数据连接时三次握手的过程:
01:24:43.163553 IP 192.168.0.114.1140 > 192.168.0.193.7254: Flags [S], seq 464133708, win 32768, options [mss 1460,nop,nop,sackOK], length 0
01:24:43.164508 IP 192.168.0.193.7254 > 192.168.0.114.1140: Flags [S.], seq 3937374868, ack 464133709, win 16384, options [mss 1452,nop,nop,sackOK], length 0
01:24:43.164521 IP 192.168.0.114.1140 > 192.168.0.193.7254: Flags [.], ack 1, win 32768, length 0
我们这里看到服务器端开放端口号不是20,是因为FTP的工作模式是被动模式(PASV),被动模式中,服务器端会创建一个新的随机的非特权端口P(P >= 1023)与客户端建立数据通道连接。
HTTP超文本协议是基于TCP,使用端口号80或8080.每当你在浏览器里输入一个网址或点击一个链接时,浏览器就通过HTTP协议将网页信息从服务器提取再显示出来。这是现在使用频率最大的应用层协议。
HTTP报文会被传输层封装为TCP报文段,然后再被IP层封装为IP数据报。
HTTP请求报文结构:
HTTP响应报文结构:
可见报文分为3部分:
请求报文的方法字段是对所请求对象进行的操作,而响应报文的状态码是一个3位数字,分为5类33种:
我们可以使用浏览器的开发者工具来查看状态码,首先使用浏览器随便访问一个网页,按F12
进入开发者工具
随意打开一个记录,比如第一个,然后点击消息头就可以看到消息头的信息:
开发者工具对消息做了一些处理,使输出更为易读,如果我们想查看原始头的信息,可以点击原始头按钮,可以看到消息的请求头和响应头,请求头里包含请求的网址,请求方法,协议版本等,响应头里包含了消息类型,编码,时间等信息。
Telent协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式,它基于TCP协议,使用端口23.
终端使用者在本地电脑上使用telent程序,用它连接到服务器,终端使用者可以在telent程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。
使用Telent协议进行远程登录时必须满足以下条件:
Telent远程登录服务分为以下4个过程:
telent使用语法:telent IP 端口(可选)
telent可以测试目标机器的TCP端口是否开放。
例如telent IP地址 3389
是用来测试目标机器的3389端口是否开放,如果连接失败,可能是以下原因:
可以使用netstat -pantu
验证端口是否开放(LISTEN说明开放状态)
TFTP是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务,它基于UDP协议,使用端口69.
此协议设计的时候是进行小文件传输的,与FTP相比少了许多功能,它只能从文件服务器上获得或写入文件,不能列出目录,不进行认证。
TFTP优点:
TFTP数据报文有五种操作码,对应了5种报文格式(1、2报文格式相同)
SMTP即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式,它使用TCP协议,使用端口25.
SMTP存在两个端:
SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服务器在向其他邮件服务器发送邮件消息时,它是作为SMTP客户在运行。
POP3即邮局协议版本3,是TCP/IP协议族中的一员,主要用于支持使用客户端远程管理在服务器上的电子邮件,使用TCP协议,使用端口110.
POP3邮件服务器大都可以“只下载邮件,服务器端并不删除”,也就是改进的POP3协议。
一封邮件的发送过程:
1、通过SMTP协议链接到SMTP服务器,然后发一封邮件给sohu的SMTP服务器;
2、通过SMTP协议将邮件转投给sina的SMTP服务器(邮件发送服务器)
3、将接收到的邮件存储到[email protected]
这个邮件账户分配的存储空间中
4、通过POP3协议连接到POP3服务器收取邮件
5、从[email protected]
账户的存储空间当中取出邮件
6、POP3服务器将取出来的邮件回送给[email protected]
账户
完。