TCP/IP学习笔记:传输层

传输层

传输层也称为运输层(Transport Layer)。在此层的分组,TCP称为“报文段”,UDP称为“数据报“。

进程到进程的数据交付(多路复用与多路分解)和差错检查是两种最低限度的传输层服务,也是UDP所能提供的仅有的两种服务。

端口号

端口号为一个16比特的值,即范围为 0-65535。其中 0-1023 称为“周知端口号”。

UDP套接字由一个二元组全面标识:目的IP地址、目的端口号。

TCP套接字由一个四元组全面标识:源IP地址、源端口号、目的IP地址、目的端口号。

TCP与UDP的比较

相比TCP,UDP满足:

  1. 关于发送什么数据以及何时发送的应用层控制更精细
  2. 无需连接建立
  3. 无连接状态(无须保存与维护连接状态,节约资源)
  4. 分组的首部开销小。(TCP:20 Bytes,UDP:8 Bytes)

UDP

报文段格式

  • 源端口号 (2 bytes)
  • 目的端口号 (2 bytes)
  • 长度 (2 bytes)
  • 检验和 (2 bytes)
  • 应用数据

当一台主机接收一个UDP分组,它的目的端口与运行中的任一UDP套接字都不匹配,则该主机发送一个特殊的ICMP数据报。

可靠数据传输

解决流水线的差错恢复有2种基本方法:

  • 回退N步(Go-Back N,GBN),即“滑动窗口协议”(Sliding-Window Protocol)
  • 选择重传(Selective Repeat,SR)。选择重传协议通过让发送方仅重传那些它怀疑在接收方出错(即丢失/受损)的分组而避免了不必要的重传。这种个别的、按需的重传要求接收方逐个确认正确接收的分组。对于选择重传协议,其窗口长度必须小于等于序号空间的一半。

TCP

概念

  • 发起连接的称为客户,另一方称为服务器。
  • TCP可从缓存中取出并放入报文段中的数据数量受限于最大报文段长度MSS(Maximum Segment Size)。MSS通常根据最初确定的由本地发送主机发送的最大链路层帧长度(最大传输单元MTU,Maximum Transmission Unit)。该MSS要保证一个TCP报文段(当封装在一个IP数据报中)加上TCP/IP首部长度(通常为40字节 [TCP首部20字节,IP首部20字节])须能放入单个链路层帧中。以太网和PPP链路层协议都具有1500字节的MTU,因此MSS的典型值为1460字节。注意MSS是指在报文段里应用层数据的最大长度而非指包括首部的TCP报文段的最大长度。

TCP/IP学习笔记:DNS

概述

DNS:Domain Name System,域名系统。它是:

  1. 一个由分层的DNS服务器(DNS Server)实现的分布式数据库;
  2. 一个使得主机能够查询分布式数据库的应用层协议。

运行在UDP之上,使用53号端口

它提供的服务:

  1. 主机名到IP地址转换的目录服务
  2. 主机别名。有着复杂主机名的主机能拥有一个或多个别名。复杂主机名也称为规范主机名。如果存在主机别名,主机别名比规范主机名更加容易记忆。应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机的IP地址。
  3. 邮件服务器别名。电子邮件应用程序可以调用DNS,对提供的主机名别名(如yahoo.com)进行解析,已获得该主机的规范主机名(如relay1.west-coast.hotmail.com)及其IP地址。
  4. 负载分配。DNS也用在冗余的服务器(如冗余的Web服务器)之间进行负载分配。繁忙的站点被冗余分布在多台服务器上,每台服务器均运行在不同的端系统上,每个都有着不同的IP地址。由于这些冗余的Web服务器,一个IP地址集合因此与同一个规范主机名相联系。DNS数据库中存储着这些IP地址集合。当客户对映射到某地址集合的名字发出一个DNS请求时,该服务器用IP地址的整个集合进行响应,但在每个回答中循环这些地址次序。因为客户通常总是向IP地址排在最前面的服务器发送HTTP请求报文,所以DNS就在所有这些冗余的Web服务器之间循环分配了负载。

域名空间


图源:《TCP/IP详解 卷1:协议》

DNS的分布式、层次数据库

大致说来,在DNS服务器的层次结构中有3种类型的DNS服务器:

  • 根DNS服务器:提供TLD服务器的IP地址。
  • 顶级域名(Top-Level-Domain, TLD)DNS服务器:提供权威DNS服务器的IP地址。
  • 权威DNS服务器:在因特网上具有公共可访问主机(如Web服务器和邮件服务器)的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址。一个组织机构的权威DNS服务器收藏了这些DNS记录。

还有一类重要的DNS服务器,严格而言它不属于DNS服务器的层次结构,但它对DNS层次结构至关重要。这一类DNS服务器是本地DNS服务器。每个ISP(如一个居民区的ISP或一个机构的ISP)都有一台本地DNS服务器(也叫默认名字服务器)。当主机与某个ISP连接时,该ISP提供一台主机的IP地址,该主机具有一台或多台其本地DNS服务器的IP地址(通常通过DHCP)。主机的本地DNS服务器通常“临近”本主机:对某机构ISP而言,本地DNS服务器可能就与主机在同一局域网中;对于某居民区ISP来说,本地DNS服务器通常与主机相隔不超过几台路由器。当主机发出DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中

查询分为递归查询迭代查询

(具体例子见 《计算机网络:自顶向下方法(原书第7版)》P86-88)

DNS缓存

在一个请求链中,当某DNS服务器接收一个DNS回答(如包含某主机名到IP地址的映射)时,它能将映射缓存在本地存储器中。由于主机和主机名与IP地址间的映射不是永久的,所以DNS服务器在一段时间后(通常设置为两天)将丢弃缓存的信息。

本地DNS服务器也能够缓存TLD服务器的IP地址,因而允许本地DNS绕过查询链中的根DNS服务器。事实上,因为缓存,除了少数DNS查询以外,根服务器基本都被绕过了。

DNS记录

共同实现DNS分布式数据库的所有DNS服务器存储了资源记录(Resource Record,RR),RR提供了主机名到IP地址的映射。资源记录是一个包含了以下字段的4元组:

(Name, Value, Type, TTL)
  • TTL

    该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。

  • Name、Value、Type

    • 若Type=A,则Name是主机名,Value是该主机名对应的IP地址。该类型的资源记录提供了标准的主机名到IP地址的映射。如(relay1.bar.foo.com, 145.37.93.126, A)
    • 若Type=NS,则Name是个域(如foo.com),而Value是个知道如何获得该域中主机IP地址的权威DNS服务器的主机名。这个记录用于沿着查询链来路由DNS查询。如(foo.com, dns.foo.com, NS)
    • 若Type=CNAME,则Value是别名为Name的主机对应的规范主机名。该记录能够向查询的主机提供一个主机名对应的规范主机名,例如(foo.com, relay1.bar.foo.com, CNAME)
    • 若Type=MX,则Value是个别名为Name的邮件服务器的规范主机名。如(foo.com, mail.bar.foo.com, MX)通过使用MX记录,一个公司的邮件服务器和其他服务器(如Web服务器)可以使用相同的别名。为了获得邮件服务器的规范主机名,DNS客户应当请求一条MX记录;而为了获得其他服务器的规范主机名,DNS客户应当请求CNAME记录。

参考资料

《计算机网络:自顶向下方法(原书第7版)》P83-92

TCP/IP学习笔记:HTTP

报文格式

请求报文

1
2
3
4
5
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr

第一行叫做请求行,其后继的行叫做首部行。首部行中,冒号左边的称为首部字段名,右边称为值。

  • 请求行

    • 方法字段
      • GET:浏览器请求一个对象。
      • POST:当用户提交表单时,HTTP客户常使用POST方法,表单中的值存放在实体体中。
      • HEAD:类似于GET方法,当服务器收到一个HEAD请求时,将对用一个HTTP报文进行响应,但是不返回请求对象
      • PUT:用户上传对象到指定的Web服务器上的指定路径(目录)。
      • DELETE:用户或应用程序删除Web服务器上的对象。
    • URL字段:例子中的/somedir/page.html
    • 版本字段:例子中的HTTP/1.1
  • 首部行

    • Host:指明对象所在的主机。
    • Connection: close告诉服务器不要使用持续连接,它要求服务器在发送完被请求的对象后就关闭这条连接。
    • User-agent:指明用户代理,即向服务器发送请求的浏览器类型。这里的Mozilla/5.0就是Firefox浏览器。
    • Accept-language:用户想得到的对象的语言,如这里的Fr即指法语版本。若服务器中没有这样的对象,那么服务器应当发送它的默认版本。
    • If-modified-since:(条件GET方法)若服务器上的对象在此日期之后被修改,服务器才会传回新对象,否则服务器返回304 Not Modified。这个日期通常来源于之前请求时得到的响应报文中的Last-modified首部行。
    • cookie:本机对应本站点的cookie。
  • 实体体(可以不存在)

    ​ 如上所述,实体体通常含通过POST方法发送的表单信息。

一个HTTP请求报文的通用格式为:

1
2
3
4
5
6
7
<方法> <URL> <版本>\r\n
<首部字段名:> <值>\r\n
<首部字段名:> <值>\r\n
...
<首部字段名:> <值>\r\n
\r\n
<实体体>

响应报文

下面这个报文可以是对上述请求报文例子的回应。

1
2
3
4
5
6
7
8
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2015, 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ...)

这个例子中,第1行称为状态行,第2-7行称为首部行,接下来是实体体。实体体部分是报文的主要部分,它包含了所请求的对象本身(表示为data data data data data ...)。

  • 状态行

    • 协议版本字段(HTTP/1.1

    • 状态码(200

      常见的状态码:

      状态码&短语 含义
      200 OK 请求成功,信息在返回的响应报文中。
      301 Moved Permanently 请求的对象已经被永久转移,新的URL定义在响应报文的Location首部行中。客户软件将自动获取新的URL。
      304 Not Modified 告诉缓存器可以使用原有对象。
      400 Bad Request 一个通用差错代码,指示该请求不能被服务器理解。
      404 Not Found 被请求的文档不在服务器上。
      505 HTTP Version Not Supported 服务器不支持请求报文使用的HTTP协议版本。
    • 相应状态信息(OK

  • 首部行

    • Connection: close告诉客户发送完报文后将关闭该TCP连接。
    • Date:服务器产生并发送该响应报文的日期和时间。(不是对象创建或最后修改的时间,而是服务器从它的文件系统中检索到该对象,将该对象插入响应报文,并发送该响应报文的时间)
    • Server:生成该报文的服务器信息。(与请求报文中的User-agent对应)
    • Last-Modified:对象创建或最后修改的日期和时间。(对对象缓存很重要)
    • Content-Length:被发送对象的字节数。
    • Content-Type:对象类型。这里对象类型是HTML文本。(对象类型应该正式地由Content-Type首部行而不是用文件扩展名来指示)
    • Set-cookie:设置cookie。
  • 实体体(可以不存在)

    ​ 含有对象内容。

参考资料

《计算机网络:自顶向下方法(原书第7版)》P64-75

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×