网络协议学习笔记
1.5层模型介绍
网络中的两台主机进行通信涉及多个步骤和协议,以下是详细的说明:
- 应用层:
- 在应用层,数据被封装为应用特定的消息或数据包,准备发送给目标主机的应用程序。
- 不同的应用程序使用不同的协议来处理其通信需求,例如:
- HTTP(Hypertext Transfer Protocol):用于Web浏览。
- FTP(File Transfer Protocol):用于文件传输。
- SMTP(Simple Mail Transfer Protocol):用于电子邮件传输。
- 传输层:
- 传输层负责在两台主机之间建立、维护和终止通信会话。主要有两个协议在这个层次使用:
- TCP(Transmission Control Protocol):提供可靠的、面向连接的通信。TCP确保数据按顺序到达,且没有丢失或损坏,适用于需要高可靠性的应用,如网页浏览和文件传输。
- UDP(User Datagram Protocol):提供不可靠的、面向无连接的通信。UDP更适合实时应用,如语音通话和视频流,它减少了延迟,但不保证数据的完整性或可靠性。
- 传输层负责在两台主机之间建立、维护和终止通信会话。主要有两个协议在这个层次使用:
- 网络层:
- 在网络层,数据被封装成数据包(packet),并赋予了源IP地址和目标IP地址。这里的主要任务是路由数据包,决定如何将数据包从源主机传送到目标主机。
- 路由器是网络层设备,根据目标IP地址来决定数据包的下一个跳(下一台路由器或目标主机)。它们通过查找路由表来做出决策。
- 数据链路层:
- 在发送端,数据被分成较小的块,称为“帧”(frames),并添加了一些控制信息,如MAC(Media Access Control)地址,这是一个唯一标识网络中设备的物理地址。
- 帧的目的是将数据从发送端的网络适配器传输到接收端的网络适配器。这个层次负责物理介质上的数据传输,并提供了错误检测和纠正机制。
- 物理层:
- 通信开始于物理层,这是网络通信的最底层。在这里,数字数据被转换成模拟信号(例如电流或光信号),然后通过物理媒体(如电缆、光纤或空气中的无线波)传输到接收端。这个过程包括信号编码、传输速率和物理连接。
通信的基本流程如下:
- 发送方的应用程序创建数据,并将其传递给传输层。
- 传输层将数据分割成数据段,并添加必要的控制信息,然后将其传递给网络层。
- 网络层根据目标主机的IP地址决定如何路由数据包,然后将数据包传递给数据链路层。
- 数据链路层将数据包封装成数据帧,并添加源和目标的MAC地址,然后将其传输到物理层。
- 物理层将数据帧转换成适当的信号,通过物理介质传输到目标主机。
- 目标主机的物理层接收信号,并将其还原成数据帧。
- 数据链路层检查数据帧的目标MAC地址,如果与自己的MAC地址匹配,就接收并解析数据包,然后将其传递给网络层。
- 网络层检查数据包的目标IP地址,如果与自己的IP地址匹配,就接收并解析数据段,然后将其传递给传输层。
- 传输层根据端口号将数据段传递给相应的应用程序。
- 目标主机的应用程序接收数据,并处理它。
通过这个层次化的结构,两台主机能够在网络中进行通信,确保数据的可靠传输和正确的路由。不同的协议和技术可以用于不同层次,以满足不同类型的通信需求。
2.应用层
1.概述
在计算机网络的五层模型中,应用层是网络协议体系结构的最高层。它的功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。它是用户与各种应用程序(终端设备)和网络之间的接口。应用层协议定义了客户端和服务器之间的通信规则,包括数据的格式、传输方式、错误处理等等。常见的应用层协议有HTTP、FTP、SMTP等 。下面详细介绍应用层的主要功能和特点:
-
用户接口:
- 应用层提供了用户与网络的接口,允许用户通过各种应用程序(例如Web浏览器、电子邮件客户端、文件传输工具)与远程主机进行通信。
-
数据交互:
- 应用层负责应用程序之间的数据交互和通信。它定义了不同应用程序之间的协议和规则,以确保数据的正确传输和处理。
-
协议支持:
-
应用层支持多种通信协议,包括HTTP、FTP、SMTP、POP3、IMAP、DNS等,每种协议用于不同类型的应用和服务。
文件传输协议(FTP):用于实现交互式文件传输功能(默认端口21)。 简单邮件传输协议(SMTP):用于实现电子邮箱传送功能(默认端口25)。 超文本传输协议(HTTP):用于实现WWW服务(默认端口80)。 域名系统(DNS):用于实现网络设备名字到IP地址映射的网络服务(默认端口53)。 简单网络管理协议(SNMP):用于管理与监视网络设备(默认端口161/162)。 远程登录协议(Telnet):用于实现远程登录功能(默认端口23) 。
-
不同的应用程序可以选择合适的协议来满足其通信需求。
-
-
数据编码和格式:
- 应用层定义了数据的编码方式和格式,以便发送和接收数据的应用程序能够正确地解释和处理数据。
- 例如,HTTP协议规定了Web页面的请求和响应格式,以便Web浏览器能够正确地显示网页内容。
-
用户身份验证和授权:
- 应用层支持用户身份验证和授权机制,以确保只有授权用户可以访问特定的应用和服务。
- 这包括登录凭证、令牌、密钥交换等安全机制。
-
错误处理和恢复:
- 应用层协议通常包括错误处理和恢复机制,以应对网络中的错误和丢包。这有助于确保数据的完整性和可靠性。
- 例如,电子邮件协议(如SMTP)可以处理邮件传输中的错误,并在必要时进行重试。
-
应用程序服务:
- 应用层还提供了各种应用程序服务,例如远程桌面、文件共享、视频会议等,使用户能够利用网络进行各种任务和活动。
2.HTTP协议
1.概述
HTTP(Hypertext Transfer Protocol)是一种用于在计算机网络上传输超文本和多媒体文档的应用层协议。它是万维网的基础,用于在Web浏览器和Web服务器之间传输数据。
每个万维网网点都有一个服务器进程,它不断地监听TCP的端口80,以便发现是否有浏览器(即万维网客户。请注意,浏览器和万维网客户是同义词)向它发出连接建立请求。一旦监听到连接建立请求并建立了TCP连接之后,浏览器就向万维网服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应。最后,TCP连接就被释放了。在浏览器和服务器之间的请求和响应的交互,必须按照规定的格式和遵循一定的规则。这些格式和规则就是超文本传送协议HTTP。
以下是HTTP协议的详细介绍:
-
HTTP的发展历史:
- HTTP最早由蒂姆·伯纳斯-李(Tim Berners-Lee)于1989年提出,用于构建万维网(World Wide Web)。
- 最初的HTTP版本是0.9,随后发展成HTTP/1.0和HTTP/1.1,后来又有HTTP/2和HTTP/3等版本。
-
通信模型:
- HTTP使用客户端-服务器模型,其中客户端(通常是Web浏览器)发送请求,而服务器回送响应。
- 请求方法(HTTP verb)包括GET、POST、PUT、DELETE等,用于指示客户端希望服务器执行的操作。
-
URL(Uniform Resource Locator):
- URL是用于标识和定位Web资源的统一格式。它包括协议(http://或https://)、主机名、端口号、路径、查询和片段等部分。
-
HTTP报文:
- HTTP通信通过请求和响应报文进行。请求报文由客户端发送,包括请求行、请求头和请求体。响应报文由服务器发送,包括状态行、响应头和响应体。
-
状态码:
- HTTP使用状态码来表示请求的处理结果,常见的状态码包括200(OK,请求成功)、404(Not Found,资源未找到)、500(Internal Server Error,服务器内部错误)等。
-
持久连接:
- HTTP/1.0中,默认情况下每个请求/响应都需要建立新的TCP连接,而HTTP/1.1引入了持久连接(Keep-Alive),允许多个请求/响应共享同一个连接,减少了连接建立和关闭的开销。
-
HTTP报头:
- 报头是包含有关请求或响应的元信息的部分。它包括通用报头、请求报头、响应报头和实体报头。报头用于传递各种信息,如内容类型、内容长度、缓存控制、Cookie等。
-
Cookie:
- Cookie是一种用于在客户端和服务器之间存储状态信息的机制。它允许服务器在多个请求之间识别用户,并保持用户的会话状态。
-
安全性:
- HTTP本身是不安全的,因为通信是明文的,可能被窃听或篡改。为提高安全性,引入了HTTPS(HTTP Secure),使用SSL/TLS协议来加密通信数据。
-
HTTP/2和HTTP/3:
- HTTP/2引入了多路复用、头部压缩等功能以提高性能。HTTP/3则基于QUIC协议,进一步提高了性能和安全性。
-
应用领域:
- HTTP在万维网上广泛应用,用于浏览网页、传输文档、下载文件、执行Web应用程序和与服务器进行交互。
总之,HTTP是Web的基础协议,它定义了客户端和服务器之间的通信规则,使得用户能够在Web上获取和分享信息。通过不断的升级和改进,HTTP在现代Web中仍然扮演着重要的角色。
2.HTTP数据包
HTTP数据包是HTTP协议中用于在客户端和服务器之间传输数据的基本单位。它是在TCP/IP网络上传输的,并且通常包含HTTP请求或响应报文。以下是HTTP数据包的详细组成:
HTTP请求数据包的组成:
-
起始行(Start Line):
- 请求方法(Request Method):指示客户端希望服务器执行的操作,如GET、POST、PUT、DELETE等。
- 请求目标(Request Target):指示请求的资源位置,通常是URL路径。
- HTTP协议版本(HTTP Version):指示使用的HTTP协议版本,如HTTP/1.1。
-
请求头部(Request Headers):
- 包含多个键值对,每个键值对代表请求的属性或信息,如:
- Host:指定请求的主机名。
- User-Agent:指定客户端的用户代理(浏览器或应用程序)。
- Accept:指示客户端可以接受的媒体类型。
- Cookie:包含客户端的Cookie信息。
- Content-Type:指定请求体的媒体类型。
- Referer:指示请求的来源页面URL。
- 包含多个键值对,每个键值对代表请求的属性或信息,如:
-
空行(Blank Line):
- 请求行和请求头之后必须有一个空行,用于分隔请求头和请求体。
-
请求体(Request Body):
- 对于POST请求等,请求体包含了发送到服务器的数据,通常用于提交表单数据、上传文件等操作。
HTTP响应数据包的组成:
-
起始行(Start Line):
- HTTP协议版本(HTTP Version):指示使用的HTTP协议版本,如HTTP/1.1。
- 状态码(Status Code):表示请求的处理结果,如200表示成功,404表示资源未找到。
- 状态信息(Status Message):与状态码相关的可选描述信息,用于对状态码进行说明。
-
响应头部(Response Headers):
- 包含多个键值对,每个键值对代表响应的属性或信息,如:
- Content-Type:指定响应体的媒体类型。
- Content-Length:指示响应体的长度。
- Set-Cookie:用于设置响应中的Cookie信息。
- Server:指示服务器软件的名称和版本号。
- 包含多个键值对,每个键值对代表响应的属性或信息,如:
-
空行(Blank Line):
- 状态行和响应头之后必须有一个空行,用于分隔响应头和响应体。
-
响应体(Response Body):
- 包含了服务器返回的实际数据,如HTML文档、图像、JSON数据等,用于显示或处理客户端请求。
HTTP数据包的结构和内容根据请求和响应的不同而有所不同,但上述组成部分构成了HTTP请求和响应数据包的通用框架。这些数据包用于在客户端和服务器之间传输数据,实现Web上的数据交换和通信。通常,这些数据包是在TCP连接上通过端口80(HTTP)或443(HTTPS)进行传输。
以下是HTTP请求包和响应包的示例:
HTTP请求包示例(GET请求):
|
|
HTTP响应包示例(200 OK响应):
|
|
上面的示例展示了一个简单的HTTP GET请求和对应的200 OK响应。请求包包括了请求行、请求头和一个空行,而响应包包括了状态行、响应头和响应体。
请求包的请求行指示执行GET操作,请求的目标是/index.html
,使用HTTP/1.1协议。请求头包括Host、User-Agent、Accept、Accept-Language等头部字段,以传递额外的信息给服务器。
响应包的状态行指示成功(状态码200 OK),协议版本是HTTP/1.1。响应头包括Date、Server、Content-Type、Content-Length等头部字段,以提供关于响应的信息。响应体包含了HTML内容,用于在客户端上显示页面。
3.状态码
HTTP协议的状态码是服务器向客户端传递的三位数字代码,用于表示特定HTTP请求的结果和状态。状态码按照其数值分为五个不同的类别,每个类别有不同的含义。以下是常见的HTTP状态码的详细介绍:
-
1xx - 信息性状态码:
- 100 Continue:表示服务器已经接收到请求的一部分,并期望客户端继续发送剩余的请求。
- 101 Switching Protocols:表示服务器已经理解客户端的请求,将切换到新的协议。
-
2xx - 成功状态码:
- 200 OK:表示请求已成功,服务器返回所请求的资源。
- 201 Created:表示请求已成功,并且服务器创建了新的资源。
- 204 No Content:表示请求成功,但服务器没有返回任何实体主体内容,通常在DELETE请求中使用。
-
3xx - 重定向状态码:
- 301 Moved Permanently:请求的资源已永久移动到新的URL,客户端应该更新其链接。
- 302 Found:请求的资源暂时移动到新的URL,客户端应该继续使用原来的URL。
- 304 Not Modified:表示资源未被修改,客户端可以使用缓存的版本。
-
4xx - 客户端错误状态码:
- 400 Bad Request:客户端发送了无效的请求,服务器无法理解。
- 401 Unauthorized:请求需要身份验证,客户端未提供有效的身份验证信息。
- 403 Forbidden:服务器拒绝了请求,通常是因为权限不足。
- 404 Not Found:请求的资源未找到。
- 405 Method Not Allowed:请求方法不允许,例如尝试对只读资源执行写操作。
- 429 Too Many Requests:客户端发送了太多的请求,超过了服务器的限制。
-
5xx - 服务器错误状态码:
- 500 Internal Server Error:服务器遇到了不可预料的错误。
- 501 Not Implemented:服务器不支持请求的功能。
- 503 Service Unavailable:服务器暂时无法处理请求,通常是因为过载或维护中。
- 504 Gateway Timeout:表示在请求的网关或代理服务器上发生超时。
这些HTTP状态码帮助客户端了解请求的结果,指导其采取适当的操作。开发人员可以根据状态码来调试和处理HTTP请求,确保客户端和服务器之间的通信顺畅。
4.HTTP协议在网站开发中的体现
在开发网站时,HTTP协议是通过Web服务器和Web浏览器之间的通信来生效的。以下是HTTP协议在网站开发中的一些关键方面:
-
Web服务器:
- 开发者通常会使用Web服务器软件(如Apache、Nginx、Microsoft IIS等)来托管他们的网站。
- Web服务器负责接收来自Web浏览器的HTTP请求,并将相应的资源(如HTML文件、图像、CSS文件、JavaScript文件等)发送回浏览器。
-
HTTP请求:
- 当用户在Web浏览器中输入URL或点击链接时,浏览器将向目标服务器发送HTTP请求。
- HTTP请求由请求行、请求头部和请求体组成,其中请求行包含了请求方法(如GET、POST、PUT)、目标URL以及HTTP协议版本。
- 请求头部包含有关请求的元信息,如用户代理、Cookie、接受的媒体类型等。
- 请求体包含请求的实际数据,通常在POST请求中使用,用于提交表单数据或上传文件等。
-
Web服务器处理请求:
- Web服务器接收到HTTP请求后,会根据请求的URL和方法来确定如何处理请求。
- 服务器可能会查找请求的资源(例如HTML文件或数据库中的数据),然后生成HTTP响应。
-
HTTP响应:
- 服务器生成HTTP响应,响应包括状态行、响应头部和响应体。
- 状态行包括状态码(如200 OK表示成功、404 Not Found表示资源未找到)和状态消息。
- 响应头部包含有关响应的元信息,如内容类型、内容长度、服务器信息等。
- 响应体包含服务器要发送给浏览器的实际数据,如HTML内容、图像、CSS等。
-
HTTP响应发送至浏览器:
- 服务器将HTTP响应发送回浏览器,浏览器根据响应的内容来渲染网页或执行其他操作。
- 如果网页包括CSS和JavaScript文件,浏览器还会发送额外的HTTP请求来获取这些资源。
-
渲染网页:
- 浏览器解析HTML文档,加载CSS和JavaScript文件,并根据这些内容渲染网页。
- JavaScript可以用于添加交互性和动态功能,与服务器进行数据交换(如AJAX请求),以及处理用户操作。
-
用户与网页交互:
- 用户与网页交互,点击链接、填写表单、提交数据等。
- 浏览器将用户的操作转化为HTTP请求,并发送给服务器,服务器进行相应的处理和响应。
总之,HTTP协议在网站开发中起到了关键的作用,它是客户端和服务器之间通信的协议,使得用户能够通过浏览器与网站进行交互,并获取到所需的网页内容和资源。开发者需要了解HTTP协议以有效地构建和维护Web应用程序。同时,也需要注意HTTP的安全性和性能优化,以提供更好的用户体验。
5.补充细节
5.1.HTTP协议本身是无连接的
HTTP使用了面向连接的TCP作为运输层协议,保证了数据的可靠传输。HTTP不必考虑数据在传输过程中被丢弃后又怎样被重传。但是,HTTP协议本身是无连接的 。这就是说,虽然HTTP使用了TCP连接,但通信的双方在交换HTTP报文之前不需要先建立HTTP连接。在1997年以前使用的是RFC 1945定义的HTTP/1.0协议。现在普遍使用的升级版本HTTP/1.1已是互联网建议标准[RFC 7231]。
5.2.HTTP协议是无状态的
HTTP协议是无状态的 (stateless)。也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时的相同(假定现在服务器还没有把该页面更新),因为服务器并不记得曾经访问过的这个客户,也不记得为该客户曾经服务过多少次。HTTP的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。
5.3 HTTP 1.1的持久连接
HTTP 1.0:默认情况下,HTTP 1.0 中的连接是非持久的,每个 HTTP 请求/响应都需要单独建立和关闭一个连接(TCP连接)。这在多次请求多个资源时会导致较大的性能开销。
HTTP 1.1:HTTP 1.1 引入了持久连接,也称为连接重用。在一个连接上,多个 HTTP 请求和响应可以通过该连接进行传输(允许多个HTTP请求和响应共享同一个TCP连接),而不需要每次都建立新的连接。这显著提高了性能,减少了延迟。
5.4 两种工作方式
HTTP/1.1协议的持续连接有两种工作方式,即非流水线方式 (without pipelining)和流水线方式 (with pipelining)。
非流水线方式的特点,是客户在收到前一个响应后才能发出下一个请求。因此,在TCP连接已建立后,客户每访问一次对象都要用去一个往返时间RTT。这比非持续连接要用去两倍RTT的开销,节省了建立TCP连接所需的一个RTT时间。但非流水线方式还是有缺点的,因为服务器在发送完一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源。
流水线方式的特点,是客户在收到HTTP的响应报文之前就能够接着发送新的请求报文。于是一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。因此,使用流水线方式时,客户访问所有的对象 只需花费一个RTT时间。流水线工作方式使TCP连接中的空闲时间减少,提高了下载文档效率。
3.URL
URL(Uniform Resource Locator)是用于标识和定位资源在互联网上位置的一种统一格式。它是由多个部分组成,用于描述资源的协议、主机名、端口、路径等信息,以便客户端能够访问和获取这些资源。以下是URL的一般结构和示例:
|
|
下面是各个部分的说明:
-
协议(Protocol):指示了访问资源所使用的协议,如HTTP、HTTPS、FTP、SMTP等。协议通常是小写的。
示例:
http://
,https://
,ftp://
-
主机名或IP地址(Host):表示资源所在的主机的域名或IP地址。对于网站,主机名通常是域名,如
www.example.com
。示例:
www.example.com
,192.168.1.1
-
端口(Port):可选部分,表示与资源通信的端口号。如果未指定,将使用协议的默认端口。
示例:
:80
,:443
-
路径(Path):表示资源在服务器上的路径,用于定位资源的具体位置。通常以
/
开头。示例:
/path/to/resource
,/folder/file.html
-
查询参数(Query):可选部分,用于向资源传递参数,通常以
?
开头,多个参数之间使用&
分隔。示例:
?key1=value1&key2=value2
-
片段标识符(Fragment):可选部分,用于指定资源中的特定片段或位置,通常以
#
开头。示例:
#section1
,#top
总之,URL是一个用于标识和定位互联网上资源的重要工具。通过URL,用户可以访问网站、下载文件、发送电子邮件等各种网络活动。不同类型的URL在结构上可能有所不同,但它们都遵循了一般的URL语法规则。
4.DNS协议
DNS(Domain Name System)是计算机网络中的一种重要协议,用于将人类可读的域名(例如www.example.com)转换为计算机能够理解的IP地址(例如192.168.1.1),以便在互联网上查找和访问网络资源。以下是DNS协议的详细介绍:
-
域名结构: 域名通常由多个部分组成,以点(.)分隔。例如,www.example.com有三个部分:www(子域),example(域名),com(顶级域)。域名从右到左解析,以查找最终的IP地址。
-
DNS服务器: DNS系统由多个DNS服务器组成,分为以下几类:
- 根DNS服务器:这些服务器位于全球各地,负责处理顶级域名(如.com、.org等)的DNS解析请求。
- 顶级域名服务器:负责管理特定顶级域的DNS记录。例如,.com顶级域有自己的一组DNS服务器。
- 权威DNS服务器:管理特定域名的DNS记录,包括该域名下的子域名。这些服务器由域名所有者维护。
- 本地DNS服务器:通常由互联网服务提供商(ISP)或组织管理,用于缓存DNS查询结果以提高查询性能,并将查询请求传递给根DNS服务器或其他适当的DNS服务器。
-
DNS解析过程: 当您输入一个域名并尝试访问一个网站时,操作系统的DNS客户端会执行以下步骤:
- 首先,它会检查本地DNS缓存,看是否已经有该域名的IP地址记录。
- 如果缓存中没有记录,它会向本地DNS服务器发送DNS查询请求。
- 本地DNS服务器会查找该域名的IP地址。如果找到,它将回复给DNS客户端。
- 如果本地DNS服务器也不知道该域名的IP地址,它会递归地向更高级别的DNS服务器发出请求,直到找到域名的IP地址或者确定该域名不存在。
-
DNS记录类型: DNS服务器包含多种类型的DNS记录,其中一些常见的包括:
- A记录:将域名映射到IPv4地址。
- AAAA记录:将域名映射到IPv6地址。
- CNAME记录:为一个域名创建别名,指向另一个域名。
- MX记录:指定邮件服务器的域名。
- TXT记录:可以存储任意文本信息,常用于验证域名的所有权。
-
DNS缓存: DNS查询结果通常被本地DNS服务器缓存一段时间,以减少对上游DNS服务器的负载,提高查询速度。但缓存也可能导致旧的或不正确的DNS信息继续存在。
-
DNS安全: DNS协议存在一些安全漏洞,如DNS劫持和DNS缓存投毒攻击。为了加强DNS的安全性,DNSSEC(DNS Security Extensions)协议被引入,它使用数字签名来验证DNS查询的真实性和完整性。
总之,DNS协议在互联网中扮演着至关重要的角色,它允许我们使用易于记忆的域名来访问互联网资源,而无需记住复杂的IP地址。了解DNS的工作原理和基本概念对于网络管理和安全非常重要。
5.从输入URL到返回结果的过程
从前端输入一个URL到返回网页结果的过程涉及多个具体的步骤,以下是详细的说明:
-
URL输入:
- 用户在浏览器的地址栏中输入URL(统一资源定位符)或点击链接,这个URL通常以
http://
或https://
开头,指定了要访问的网站和资源的位置。
- 用户在浏览器的地址栏中输入URL(统一资源定位符)或点击链接,这个URL通常以
-
域名解析:
- 浏览器首先会解析URL中的域名,将其转换为IP地址。这一步骤通常包括以下过程:
- 浏览器检查本地缓存,看是否已经解析过该域名,以减少DNS查询次数。
- 如果本地缓存中没有相关记录或者记录已经过期,浏览器会向本地操作系统发出DNS(Domain Name System)解析请求。
- 操作系统将DNS请求发送给本地DNS解析器,该解析器可能会缓存域名解析结果,或者向根DNS服务器发出请求。
- 逐级向上查询,直到找到域名对应的IP地址。
- 解析器将IP地址返回给浏览器。
- 浏览器首先会解析URL中的域名,将其转换为IP地址。这一步骤通常包括以下过程:
-
建立TCP连接:
- 浏览器使用目标IP地址和端口号(通常是80或443)建立TCP连接到Web服务器。这个过程包括三次握手(TCP三次握手协议)以确保双方都准备好进行通信。
-
发起HTTP请求:
- 一旦建立了TCP连接,浏览器会发送HTTP请求到Web服务器,这个请求包括:
- 请求方法(GET、POST、PUT等):指示服务器要执行的操作。
- 请求头部:包含有关请求的元信息,如User-Agent、Accept、Cookie等。
- 请求体:对于POST请求等,包含了请求的实际数据,如表单提交的数据。
- 一旦建立了TCP连接,浏览器会发送HTTP请求到Web服务器,这个请求包括:
-
服务器处理请求:
- 服务器接收到HTTP请求后,会解析请求头部和请求体,并根据请求内容执行相应的操作,例如:
- 查找请求的资源,如HTML文件、图像、CSS、JavaScript等。
- 执行后端逻辑,从数据库中检索数据或进行其他计算。
- 生成HTTP响应。
- 服务器接收到HTTP请求后,会解析请求头部和请求体,并根据请求内容执行相应的操作,例如:
-
发送HTTP响应:
- 服务器生成HTTP响应,响应包括:
- 状态行:指示响应的状态码(如200表示成功、404表示资源未找到)。
- 响应头部:包含有关响应的元信息,如Content-Type、Content-Length、Set-Cookie等。
- 响应体:包含服务器返回的实际数据,如HTML内容、图像或其他资源。
- 服务器生成HTTP响应,响应包括:
-
接收和渲染网页:
- 浏览器接收到HTTP响应后,会解析响应头部和响应体。
- 如果响应的内容是HTML文档,浏览器会开始解析HTML、加载其他资源(如CSS、JavaScript)并渲染网页。
- JavaScript代码可以添加交互性和动态功能,与服务器进行数据交换(如AJAX请求)并处理用户操作。
-
完成网页加载:
- 网页加载完成后,用户可以与网页交互,点击链接、填写表单、执行JavaScript操作等。
这些步骤构成了从URL输入到返回网页结果的整个过程。在这个过程中,浏览器、DNS解析器、操作系统、Web服务器等多个组件协同工作,以实现将用户的请求转化为可视化的网页。
2.传输层
1.为什么需要传输层?
本部分来自《谢希仁——计算机网络(第7版)》的第5章。
下面通过图5-1的示意图来说明运输层的作用。设局域网LAN1上的主机A和局域网LAN2上的主机B通过互连的广域网WAN进行通信。我们知道,IP协议能够把源主机A发送出的分组,按照首部中的目的地址,送交到目的主机B,那么,为什么还需要运输层呢?

从IP层来说,通信的两端是两台主机。IP数据报的首部明确地标志了这两台主机的IP地址。但“两台主机之间的通信”这种说法还不够清楚。这是因为,真正进行通信的实体是在主机中的进程,是这台主机中的一个进程 和另一台主机中的一个进程 在交换数据(即通信)。因此严格地讲,两台主机进行通信就是两台主机中的应用进程互相通信 。IP协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付主机中的应用进程。从运输层的角度看,通信的真正端点并不是主机而是主机中的进程 。也就是说,端到端的通信 是应用进程之间的通信。在一台主机中经常有多个应用进程同时分别和另一台主机中的多个应用进程通信。例如,某用户在使用浏览器查找某网站的信息时,其主机的应用层运行浏览器客户进程。如果在浏览网页的同时,还要用电子邮件给网站发送反馈意见,那么主机的应用层就还要运行电子邮件的客户进程。在图5-1中,主机A的应用进程AP1 和主机B的应用进程AP3 通信,而与此同时,应用进程AP2也和对方的应用进程AP4通信。这表明运输层有一个很重要的功能——复用 (multiplexing)和分用 (demultiplexing)。这里的“复用”是指在发送方不同的应用进程都可以使用同一个运输层协议传送数据(当然需要加上适当的首部),而“分用”是指接收方的运输层在剥去报文的首部后能够把这些数据正确交付目的应用进程。图5-1中两个运输层之间有一个双向粗箭头,写明“运输层提供应用进程间的逻辑通信 ”。“逻辑通信”的意思是:从应用层来看,只要把应用层报文交给下面的运输层,运输层就可以把这报文传送到对方的运输层(哪怕双方相距很远,例如几千公里),好像这种通信就是沿水平方向直接传送数据。但事实上这两个运输层之间并没有一条水平方向的物理连接。数据的传送是沿着图中的虚线方向(经过多个层次)传送的 。“逻辑通信”的意思是“好像是这样通信,但事实上并非真的这样通信”。
从这里可以看出网络层和运输层有明显的区别。网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信 (见图5-2)。然而正如后面还要讨论的,运输层还具有网络层无法代替的许多其他重要功能。

运输层还要对收到的报文进行差错检测 。大家应当还记得,在网络层,IP数据报首部中的检验和字段,只检验首部是否出现差错而不检查数据部分。
根据应用程序的不同需求,运输层需要有两种不同的运输协议,即面向连接的TCP 和无连接的UDP ,这两种协议就是本章要讨论的主要内容。
我们还应指出,运输层向高层用户屏蔽了下面网络核心的细节 (如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道 ,但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别。当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的 (只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道 。但当运输层采用无连接的UDP协议时,这种逻辑通信信道仍然是一条不可靠信道 。
1.功能概述
计算机网络的五层结构中,传输层是其中之一,负责提供端到端的数据传输和错误检测、纠正。传输层的主要功能是确保数据可靠地传输,同时管理多个应用程序之间的通信。以下是传输层的详细介绍:
传输层的主要功能:
-
端到端通信:传输层负责在源主机和目标主机之间建立端到端的通信连接。这意味着它管理着数据在网络上的传输,以确保数据能够可靠地到达目标。
-
数据分段和重组:传输层将上层应用层提供的数据分割成适合网络传输的小块,通常称为数据段。在目标主机上,传输层负责将这些数据段重新组装成完整的消息或文件。
-
端口与套接字:传输层使用端口号来标识不同的应用程序。每个正在运行的应用程序都会监听一个或多个端口,以便与其他主机上的应用程序通信。传输层通过套接字(socket)将数据连接到正确的端口。
套接字(Socket)在网络编程中通常被描述为一个四元组的概念。这个四元组包括了以下信息,用于唯一标识一个网络连接:
- 源IP地址:这是发送数据的主机的IP地址。
- 源端口号:这是发送数据的主机上用于发送数据的端口号。
- 目标IP地址:这是接收数据的主机的IP地址。
- 目标端口号:这是接收数据的主机上用于接收数据的端口号。
这个四元组确保了网络中的每个套接字连接都是唯一的,因为不同的连接至少在其中一个方面有所不同(源IP、源端口、目标IP、目标端口)。这个四元组在操作系统内部用于路由数据包和确保数据包传递到正确的套接字。
-
可靠性:传输层通过使用可靠的传输协议(如TCP)来确保数据的可靠传输。它使用确认、重传机制和流量控制来处理丢失的数据包和网络拥塞。
-
数据完整性:传输层可以使用检验和或循环冗余校验(CRC)等技术来检测数据包是否在传输过程中被损坏。如果数据包被损坏,传输层可以请求重新传输或通过纠错码进行修复。
-
流量控制:传输层负责控制数据的流量,以避免过多的数据拥塞网络。它使用流量控制机制来限制发送方发送数据的速率,以适应接收方的处理能力。
-
多路复用与多路分解:传输层支持多路复用,允许多个应用程序共享相同的网络连接。它还支持多路分解,将传入的数据包分发到正确的应用程序。
传输层的主要协议:
- TCP(Transmission Control Protocol):
- TCP是一种面向连接的、可靠的传输层协议,它确保数据可靠地传输到目标主机。
- TCP使用三次握手建立连接,使用确认和重传机制来处理丢失的数据包,以及使用流量控制来避免网络拥塞。
- 它适用于需要可靠数据传输的应用程序,如Web浏览、电子邮件传输等。
- UDP(User Datagram Protocol):
- UDP是一种无连接的传输层协议,它提供了较低的开销和更快的传输速度,但不保证数据的可靠性。
- UDP适用于实时应用程序,如音频和视频流,以及需要低延迟的应用程序,如在线游戏。
传输层在计算机网络中扮演着关键的角色,它为应用层提供了端到端的通信能力,并确保数据可靠地传输。选择适当的传输层协议取决于应用程序的需求,包括可靠性、延迟、吞吐量和网络条件。
2.基本数据单元
传输层的基本数据单元是报文(Segment)或数据段(Datagram),具体取决于使用的传输层协议。传输层协议负责将报文从一个主机传输到另一个主机,并在需要时确保其可靠性。
以下是两种主要的传输层协议和它们对应的基本数据单元:
-
TCP(Transmission Control Protocol):
- 基本数据单元:TCP报文(Segment)
- TCP协议使用报文作为其基本数据单元。每个TCP报文包括报文头和数据部分。报文头包含了各种控制信息,如源端口、目标端口、序列号、确认号、窗口大小等。数据部分则包含传输的应用程序数据。
-
UDP(User Datagram Protocol):
- 基本数据单元:UDP数据段(Datagram)
- UDP协议使用数据段作为其基本数据单元。UDP数据段包括源端口、目标端口、数据长度和校验和。与TCP不同,UDP不提供可靠性和流量控制,因此它更轻量级,适用于一些实时性要求高的应用,如音频和视频传输。
这两种传输层协议都在网络上传输应用层的数据,但它们的特性和用途不同。TCP提供可靠的、面向连接的通信,确保数据的完整性和顺序性,适用于需要可靠性的应用。UDP提供无连接的通信,更适合实时性要求高、可以容忍一些数据丢失的应用。
传输层的基本数据单元,无论是TCP的报文还是UDP的数据段,都是在传输层协议的控制下在网络上进行传输的。这些基本数据单元帮助确保应用程序数据的可靠传输和正确解释。
3.使用UDP和TCP的应用层协议
应用 | 应用层协议 | 运输层协议 |
---|---|---|
名字转换 | DNS(域名系统) | UDP |
文件传送 | TFTP(简单文件传送协议) | UDP |
路由选择协议 | RIP(路由信息协议) | UDP |
IP地址配置 | DHCP(动态主机配置协议) | UDP |
网络管理 | SNMP(简单网络管理协议) | UDP |
远程文件服务器 | NFS(网络文件系统) | UDP |
IP电话 | 专用协议 | UDP |
流式多媒体通信 | 专用协议 | UDP |
多播 | IGMP(网际组管理协议) | UDP |
电子邮件 | SMTP(简单邮件传送协议) | TCP |
远程终端接入 | TELNET(远程终端协议) | TCP |
万维网 | HTTP(超文本传送协议) | TCP |
文件传送 | FTP(文件传送协议) | TCP |
4.TCP协议
1.特点
TCP(Transmission Control Protocol)是计算机网络中的一种传输层协议,提供了可靠的、面向连接的数据传输服务。以下是TCP协议的详细介绍,包括TCP报文段的各个组成部分:
TCP协议的特点:
- 可靠性:TCP保证数据的可靠传输,通过序列号、确认和重传机制来检测和纠正数据的丢失、损坏或乱序。
- 面向连接:TCP建立连接以确保通信的两端能够互相识别和信任。连接的建立、数据传输和连接的关闭都需要一定的握手过程。
- 全双工:TCP连接是全双工的,允许双方同时发送和接收数据。
- 流量控制:TCP使用窗口机制进行流量控制,以避免过载发送方和接收方。
- 拥塞控制:TCP通过监测网络拥塞状态,并采取相应的措施来避免网络拥塞。
2.TCP报文段的组成
TCP报文段的各个组成部分:

TCP通信中的数据单元是TCP报文段,以下是TCP报文段的各个组成部分:
-
源端口号(Source Port):
- 长度:16位
- 作用:指定发送端的端口号。
-
目标端口号(Destination Port):
- 长度:16位
- 作用:指定接收端的端口号。
-
序列号(Sequence Number):
- 长度:32位
- 作用:用于对数据进行编号,确保数据的有序传输。通常在建立连接时初始化,并递增以表示发送的数据量。
-
确认号(Acknowledgment Number):
- 长度:32位
- 作用:表示期望接收的下一个字节的序列号,用于实现可靠数据传输和确认。
-
数据偏移(Data Offset):
- 长度:4位
- 作用:指示TCP报文头部的长度,以字节为单位。由于TCP头部的长度可变,这个字段用于确定数据部分的开始位置。
-
保留(Reserved):
- 长度:6位
- 作用:保留字段,暂时未使用,将来可能用于其他用途。
-
控制标志(Flags):
- 长度:6位
- 作用:包含多个标志位,用于控制TCP连接和传输的各个方面,其中一些常见的标志包括:
- URG(Urgent):表示紧急指针字段有效。
- ACK(Acknowledgment):表示确认号字段有效。
- PSH(Push):提示接收端尽快交付数据。
- RST(Reset):用于重置连接。
- SYN(Synchronize):用于建立连接。
- FIN(Finish):用于关闭连接。
-
窗口大小(Window Size):
- 长度:16位
- 作用:表示发送端当前愿意接收的数据量,用于流量控制。
-
校验和(Checksum):
- 长度:16位
- 作用:用于检测报文头部和数据的传输错误,以确保数据的完整性。
-
紧急指针(Urgent Pointer):
- 长度:16位
- 作用:仅当URG标志被设置时,此字段指示紧急数据的位置。
-
选项(Options):
- 长度:可变
- 作用:可选字段,用于传递附加信息。常见的TCP选项包括最大报文段长度(MSS)、窗口扩大因子、时间戳等。
-
数据(Data):
- 长度:可变
- 作用:实际传输的应用层数据,它的长度可以根据需要而变化。
TCP报文段的这些字段和标志位一起提供了可靠的、有序的、面向连接的数据传输。TCP协议确保了数据的可靠性,保证数据按顺序到达,并提供了流量控制和拥塞控制机制,以适应不同网络条件和需求。这些功能使得TCP在互联网通信中非常重要,尤其是对于需要可靠数据传输的应用程序。
3.三次握手
TCP协议的三次握手是建立TCP连接的过程,它用于确保通信的两端都能够发送和接收数据。以下是TCP三次握手的详细过程:
-
第一次握手 - 客户端到服务器端(SYN):
- 客户端首先向服务器端发送一个特殊的TCP报文,这个报文中包含了SYN标志位(Synchronize)。
- 客户端选择一个随机的初始序列号(ISN,Initial Sequence Number),用于标识后续发送的数据包。
- 这个报文的目标是服务器端的IP地址和端口号。
- 客户端进入SYN-SENT状态,等待服务器的确认。
-
第二次握手 - 服务器端到客户端(SYN + ACK):
- 服务器端收到客户端的SYN报文后,确认接收到了客户端的连接请求。
- 服务器端也会选择一个随机的初始序列号,用于标识自己发送的数据包。
- 服务器端向客户端发送一个包含SYN和ACK标志位的报文,表示同意建立连接。
- 这个报文的目标是客户端的IP地址和端口号。
- 服务器端进入SYN-RECEIVED状态。
-
第三次握手 - 客户端到服务器端(ACK):
- 客户端收到服务器端的SYN + ACK报文后,确认服务器端的连接确认。
- 客户端向服务器端发送一个带有ACK标志位的报文,表示连接建立成功。
- 这个ACK报文中包含了服务器端所发送的初始序列号加1(服务器的ISN + 1),用于确认服务器端的数据包。
- 服务器端收到客户端的ACK报文后,也确认连接建立成功。
- 客户端和服务器端都进入已建立连接的状态(ESTABLISHED)。
至此,TCP连接已经成功建立。这个三次握手过程的目的是确保双方都能够正确地发送和接收数据,并且初始化序列号以进行数据传输。如果任何一方在握手过程中未收到预期的响应或遇到问题,它将重新发起连接请求或执行适当的错误处理。完成三次握手后,双方可以开始安全地传输数据。
4.四次挥手
TCP协议的四次挥手是用于关闭一个已建立的TCP连接的过程,确保数据的完整传输和连接的安全关闭。以下是TCP四次挥手的详细过程:
-
第一次挥手 - 客户端发送关闭请求(FIN):
- 客户端首先决定关闭连接,它发送一个TCP报文,其中包含了FIN标志位(Finish)。
- 这个FIN报文表示客户端不再有数据要发送给服务器端了,但仍然可以接收来自服务器的数据。
- 客户端进入FIN-WAIT-1状态,等待服务器的确认或反馈。
-
第二次挥手 - 服务器端确认关闭请求(ACK):
- 服务器端收到客户端的FIN报文后,确认关闭请求,并发送一个包含ACK标志位的TCP报文。
- 服务器端进入CLOSE-WAIT状态,表示它已经关闭了向客户端的数据发送通道。
-
第三次挥手 - 服务器端发送关闭请求(FIN):
- 服务器端在某个时刻决定关闭连接,它发送一个带有FIN标志位的报文给客户端。
- 这个FIN报文表示服务器端不再有数据要发送给客户端,并请求客户端关闭连接。
- 服务器端进入LAST-ACK状态。
-
第四次挥手 - 客户端确认关闭请求(ACK):
- 客户端收到服务器端的FIN报文后,确认关闭请求,并发送一个包含ACK标志位的报文给服务器端。
- 客户端进入TIME-WAIT状态,等待一段时间(通常是两个最大段寿命的时间,以确保之前的ACK报文能够到达服务器),然后关闭连接。
- 服务器端收到客户端的ACK报文后,也关闭连接。
至此,TCP连接已经成功关闭。四次挥手确保了双方都能够安全地关闭连接,完成了数据的传输和连接的释放。客户端和服务器端都可以进入CLOSED状态,表示连接已经关闭。TIME-WAIT状态的存在是为了确保之前的ACK报文能够达到服务器,以防止潜在的重复数据包干扰。这个等待时间是为了确保连接的可靠关闭,一旦过了这个时间,客户端将终止TIME-WAIT状态。
3.网络层
1.介绍
网络层是计算机网络体系结构中的一层,它位于数据链路层之上,传输层之下。网络层的主要功能是实现不同网络之间的数据传输和路由选择。以下是网络层的详细介绍:
-
数据包传输:网络层负责将数据从源主机传输到目标主机。数据通常被分割成数据包,每个数据包都包含了目标主机的地址信息,以便在网络中进行传输。
-
地址分配和识别:网络层使用网络地址来标识主机和子网。IPv4和IPv6是两种常见的网络层协议,它们用于分配和识别主机和网络。
-
路由选择:网络层决定数据包的最佳路径从源到目标。这涉及到路由算法,它们根据不同的度量标准(如跳数、延迟、带宽等)来选择最佳路径。
-
拆装数据包:在网络层,数据包可能需要被拆分成更小的片段,以适应不同的网络传输介质和最大传输单元(MTU)的限制。接收端负责将这些片段重新组装成完整的数据包。
-
错误检测和纠正:网络层通常包含一些错误检测和纠正机制,以确保数据在传输过程中没有损坏。例如,IPv4头部包含了一个校验和字段,用于检测头部错误。
-
多路复用和多路分解:网络层允许多个数据流在同一物理链路上传输。它使用端口号来区分不同的应用程序或服务,并确保数据正确地路由到目标主机的相应端口。
-
跨子网通信:网络层能够将数据从一个子网传输到另一个子网,允许不同子网中的主机进行通信。这通常涉及到使用路由器来连接不同的子网。
-
流量控制:网络层可以控制数据包的发送速率,以避免网络拥塞并确保网络资源的有效使用。
-
安全性:网络层可以通过实施安全协议和机制来保护数据的机密性和完整性。例如,虚拟专用网络(VPN)使用网络层协议来加密数据。
-
跨网络通信:网络层使得不同类型的网络(例如以太网、Wi-Fi、蜂窝网络等)能够互联,实现全球性的通信。
在网络层中,最著名的协议是IPv4和IPv6,它们是互联网的基础协议,用于实现全球范围的数据传输。除此之外,还有一些其他的网络层协议和技术,如ICMP(Internet Control Message Protocol)、OSPF(Open Shortest Path First)、BGP(Border Gateway Protocol)等,它们在特定的网络环境中发挥重要作用。网络层在整个网络体系结构中扮演着关键的角色,确保数据能够有效、安全地在不同的网络之间传输。
2.IP数据报的组成

IP数据报(分组)是在网络层(第三层)使用的基本数据传输单元,用于在计算机网络中传递数据。IP数据报的组成包括以下部分:
(1)版本 占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。关于以后要使用的IPv6(即版本6的IP协议),我们将在后面的4.6节讨论。
(2)首部长度 占4位,可表示的最大十进制数值是15。请注意,首部长度字段所表示数的单位是32位字(1个32位字长是4字节)。因为IP首部的固定长度是20字节,因此首部长度字段的最小值是5(即二进制表示的首部长度是0101)。而当首部长度为最大值1111时(即十进制数的15),就表明首部长度达到最大值15个32位字长,即60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此IP数据报的数据部分永远在4字节的整数倍时开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度是20字节(即首部长度为0101),这时不使用任何选项。
(3)区分服务 占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型 ,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务 DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用(见8.4.4节)。在一般的情况下都不使用这个字段[RFC 2474,3168,3260]。
(4)总长度 总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2 16 –1=65535字节。然而实际上传送这样长的数据报在现实中是极少遇到的。
我们知道,在IP层下面的每一种数据链路层协议都规定了一个数据帧中的数据字段的最大长度 ,这称为最大传送单元 MTU(Maximum Transfer Unit)。当一个IP数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层所规定的MTU值。例如,最常用的以太网就规定其MTU值是1500字节。若所传送的数据报长度超过数据链路层的MTU值,就必须把过长的数据报进行分片处理。
虽然使用尽可能长的IP数据报会使传输效率得到提高(因为每一个IP数据报中首部长度占数据报总长度的比例就会小些),但数据报短些也有好处。每一个IP数据报越短,路由器转发的速度就越快。为此,IP协议规定,在互联网中所有的主机和路由器,必须能够接受长度不超过576字节的数据报。这是假定上层交下来的数据长度有512字节(合理的长度),加上最长的IP首部60字节,再加上4字节的富余量,就得到576字节。当主机需要发送长度超过576字节的数据报时,应当先了解一下,目的主机能否接受所要发送的数据报长度。否则,就要进行分片。
在进行分片时(见后面的“片偏移”字段),数据报首部中的“总长度”字段是指分片后的每一个分片的首部长度与该分片的数据长度的总和。
(5)标识 (identification) 占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
(6)标志 (flag) 占3位,但目前只有两位有意义。
- 标志字段中的最低位记为MF (More Fragment)。MF=1即表示后面“还有分片 ”的数据报。MF=0表示这已是若干数据报片中的最后一个。
- 标志字段中间的一位记为DF (Don’t Fragment),意思是“不能分片 ”。只有当DF=0时才允许分片。
(7)片偏移 占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对
位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。
(8)生存时间 占8位,生存时间字段常用的英文缩写是TTL(Time To Live),表明这是数据报在网络中的寿命 。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在互联网中兜圈子(例如从路由器R1转发到R2,再转发到R1,然后又转发到R1),因而白白消耗网络资源。最初的设计是以秒作为TTL值的单位。每经过一个路由器时,就把TTL减去数据报在路由器所消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值减为零时,就丢弃这个数据报。
然而随着技术的进步,路由器处理数据报所需的时间不断在缩短,一般都远远小于1秒,后来就把TTL字段的功能改为“跳数限制 ”(但名称不变 )。路由器在每次转发数据报之前就把TTL值减1。若TTL值减小到零,就丢弃这个数据报,不再转发。因此,现在TTL的单位不再是秒,而是跳数 。TTL的意义是指明数据报在互联网中至多可经过多少个路由器。显然,数据报能在互联网中经过的路由器的最大数值是255。若把TTL的初始值设置为1,就表示这个数据报只能在本局域网中传送。因为这个数据报一传送到局域网上的某个路由器,在被转发之前TTL值就减小到零,因而就会被这个路由器丢弃。
(9)协议 占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个协议进行处理。
常用的一些协议和相应的协议字段值如下:

(10)首部检验和 占16位。这个字段只检验数据报的首部,但不包括数据部分 。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。为了进一步减小计算检验和的工作量,IP首部的检验和不采用复杂的CRC检验码而采用下面的简单计算方法:在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段。接收方收到数据报后,将首部的所有16位字再使用反码算术运算相加一次。将得到的和取反码,即得出接收方检验和的计算结果。若首部未发生任何变化,则此结果必为0,于是就保留这个数据报。否则即认为出差错,并将此数据报丢弃。
(11)源地址 占32位。
(12)目的地址 占32位。
IP数据报首部的可变部分
IP数据报首部的可变部分就是一个选项字段。选项字段用来支持排错、测量以及安全等措施,内容很丰富。此字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目。某些选项项目只需要1个字节,它只包括1个字节的选项代码。而有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0的填充字段补齐成为4字节的整数倍。
增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用。很多路由器都不考虑IP首部的选项字段,因此新的IP版本IPv6就把IP数据报的首部长度做成固定的。
3.分组转发
IP数据报的分组转发是通过路由器实现的,路由器是网络中的网络设备,负责决定将数据包从源主机传输到目标主机的最佳路径。以下是IP数据报的分组转发的基本过程:
-
接收数据包:路由器首先接收到进入其接口的IP数据包。这些数据包可能来自连接到路由器的本地网络,也可能是从其他网络传输过来的。
-
解析数据包:路由器解析接收到的IP数据包,包括检查IP头部中的字段,如目标IP地址、TTL(生存时间)、协议字段等。
-
查找路由表:路由器使用路由表来确定如何转发数据包。路由表包含了一系列的路由条目,每个路由条目指示了特定目标IP地址的下一跳路由器或出口接口。路由器根据目标IP地址查找匹配的路由条目。
-
确定下一跳:一旦路由器找到匹配的路由条目,它确定下一跳路由器或出口接口。这通常涉及查找最长前缀匹配,以确定最佳的路由。
-
更新TTL字段:在数据包被转发之前,路由器会减少TTL字段的值,以指示数据包在网络中的生存时间。如果TTL字段减少到零,路由器将丢弃数据包,并发送ICMP时间超时消息给源主机。
-
转发数据包:路由器将数据包发送到下一跳路由器或出口接口,根据路由表中的信息。这个过程可能涉及数据包的重新封装,以更新数据链路层头部信息。
-
重复过程:接下来的路由器(如果有的话)重复这个过程,将数据包传输到下一个路由器,直到数据包到达目标主机所在的网络。
-
交付目标主机:最终,数据包到达目标主机所在的网络,路由器将数据包传递给目标主机,以完成数据传输过程。
这个过程中的每个路由器都是根据自身的路由表和路由算法来做出决策的。路由表可以根据网络的拓扑结构和路由策略进行动态更新,以适应网络中的变化和流量的需求。分组转发是保证数据包从源到目标的可靠传递的核心机制,它允许数据包穿越多个网络和路由器,最终到达目标主机。