夜光:计算机网络笔记(十八)

夜光序言:

 

所以如果有不幸你要自己承担,安慰有时候捉襟见肘,自己不坚强也要打得坚强。还没有衣不蔽体食不果腹举目无亲,我们没有资格难过,我们还能把快乐写得源远流长

 

 

 

 

 

 

 

 

正文:

【自学笔记】
      概述和传输层服务


传输层协议为运行在不同主机上的应用进程之间提供逻辑通信功能。

从应用程序的角度看,通过逻辑通信,运行不同进程的主机好像直接相连一样;实际上,这些主机也许位于地球的两侧,通过很多路由器及多种不同类型的链路相连。

 

传输层协议是在端系统中而不是在网络路由器中实现的。

在发送方,运输层将接收到的来自发送应用进程的报文转换成传输层分组,称其为传输层报文段(segment)。这个过程是将应用消息划分为较小的块,并为每块加上一个传输层首部来创建传输层报文段。然后,在发送方端系统中,传输层将这些报文段传递给网络层,网路层将其封装成网络层分组(数据报)并向目的地发送。

 


网络路由器仅检查该数据报的网络层字段,即它们不检查封装在该数据报的传输层报文段的字段。

在接收方,网络层从数据报中提取传输层报文段,并将该报文段向上交给传输层。传输层则处理接收到的报文段,使得接收方应用进程可应用该报文段中的数据。

TCP/IP 网络有两种传输层协议,即 TCP 和 UDP。

传输层为运行在不同主机上的进程之间提供了逻辑通信,而网络层则提供了主机之间的逻辑通信。 

传输层协议所能提供的服务也受到了底层网络层协议的服务模型的限制。如果网络层协议不能为两主机之间发送的传输层报文段提供时延和带宽保证,那么传输层协议也不能为两进程之间发送的消息提供时延和带宽保证。

 

然而,即使底层网络协议在网络层不提供相应服务,传输层协议也能提供某些服务。例如传输层能为应用程序提供可靠的传输服务。

 

另一个例子是即使网络层不能保证传输层报文段的机密性,传输层也能使用加密来确保应用层消息不被入侵者读取


 

多路复用与多路分解

 

传输层的多路复用与多路分解,也就是将网络层所提供的主机到主机交付服务扩展到为在主机上运行的应用程序所提供的进程到进程交付服务。

在目的主机,传输层从紧邻其下的网络层接收报文段。传输层负责将这些报文段中的数据交付给在主机上运行的合适的应用进程。

一个例子:假定你正坐在计算机前下载 Web 页面,同时还在运行一个 FTP 会话。此时你就有 2 个网络应用进程在运行,即一个 FTP 进程和一个 HTTP 进程。当计算机的传输层从底层的网络层接收数据时,它需要将所接收到的数据定向到这 2 个进程中的一个。

 

接收主机中的传输层通过一个套接字来传递数据。由于在任何一个时刻接收主机上可能有多个套接字,所以每个套接字都必须有唯一的标识符。

在每个传输层报文段中包含了两个端口号字段,在接收端,传输层检查这些字段并标识出接收套接字,然后将报文段定向到该套接字。

可以将一个套接字理解成两小段内存空间:发送缓存和接收缓存,这两段存储空间通过套接字的变量名来标识。 

将传输层报文段中的数据放置到正确的套接字的工作称为多路分解,确切地说,多路分解其实是多路分发,或者说是数据流的分解。

数据交付到特定套接字的工作也就是将数据放到正确的存储位置的过程。从源主机的不同套接字中收集数据块,井为每个数据块封装上首部信息(在多路分解时使用)从而生成报文段,然后将报文段传递到网络层的工作称为多路复用。

 

传输层多路复用的要求:

①套接字有唯一标识符,

②每个报文段有特殊字段来指示该报文段所要交付的套接字。这些特殊字段最重要的是源端口号字段(source port number field)和目的端口号字段(destination port number field)。

端口号是一个 16 比特的数字,其大小在 0-65535 之间。0-1000 范围的端口号称为周知
端口号,它们是保留给诸如 HTTP 和 FTP 之类的公有的应用层协议的。 

当一个网络应用程序运行时,必须为其分配一个端口号。
 

 



 1.无连接的多路复用与多路分解


 假定主机 A 中的一个进程具有的 UDP 端口号为 9157,它要发送一个应用程序数据块给主机 B 中的另一进程,该进程具有的 UDP 端口号为 6428。主机 A 中的传输层创建一个传输层报文段,其中包括应用程序数据、源端口号 9157、目的端口号 6428 和两个其他字段。

然后,传输层将生成的报文段传递到网络层。网络层将该报文段封装到一个 IP 数据报中,并尽力而为地将报文段交付给接收主机。

如果该报文段到达接收主机 B,接收主机传输层就检查该报文段中的目的端口号 6428,并将该报文段传递给端口号 6428 所标识的套接字。注意到主机 B 能够运行多个进程,每个进程有自己的 UDP 套接字及对应的端口号。当从网络接收到达的 UDP 报文段时,主机 B 通过检查该报文段中的目的端口号,将报文段定向(多路分解)到相应的套接字。

因此,一个 UDP 套接字是由一个包含目的 lP 地址和目的端口号的二元组来标识的。因此,如果两个 UDP 报文段有不同的源 IP 地址或源端口号,但具有相同的目的 IP 地址和目的端口号,那么这两个报文段将通过相同的目的套接字定向到相同的目的进程


 

在 A 到 B 的报文段中,源端口号作为“返回地址”的一部分,即当 B 需要发回一个报文段给 A 时,B 到 A 的报文段中的目的端口号便从 A 到 B 的报文段的源端口号中取值。


 

2.面向连接的多路复用与多路分解

 

TCP 套接字是由一个四元组(源 IP 地址,源端口号,目的 IP 地址,目的端口号)来标识的。 

这样,当一个 TCP 报文段从网络到达一台主机时,主机使用这 4 个值来将报文段定向(多路分解)到相应的套接字。

 

在 TCP 服务器程序接受客户机连接,accept()函数创建并返回一个新的连接套接字用于与客户机的通信,并将这个套接字与请求报文段中的 4 个值:

①该报文段中的源端口号,

②源主机 IP 地址,

③该报文段中的目的端口号,

④自身的 IP 地址 建立关联。也就是说新创建的连接套接字通过这 4 个值来标识。

所有后续到达的报文段,如果它们的源端口号、源主机 IP 地址、目的端口号和目的 IP地址都与这 4 个值匹配,则被多路分解到这个套接字。

 

为什么使用 4 元组呢?

 

例如主机 B 向服务器 C 发起了两个 HTTP 会话(两个浏览器窗口),主机 A 向服务器 C 发起了一个 HTTP 会话。主机 A 与主机 B 及服务器 C 都有自己的唯一 IP 地址,主机 B 为其两个连接分配了两个不同的源端口号(5775 和 9157)。因为主机 A 独立选择源端口号,因此它也可能将源端口号 9157 分配给其 HTTP 连接。

 

对于服务器 C 来说,它得区分不同的浏览器连接请求,对于每个请求,它都有相应的套接字(套接字具有不同的发送/接收缓存)与之对应。它要分发不同主机浏览器过来的请求,并返回不同的响应消息给客户机。

 

目的端口号:C 服务器运行了不同的应用,显然,只有 web 服务器使用了 80 端口,应此 C 服务器在转发报文段给应用的时候要看这个字段。

 

目的 IP 地址:一般服务器都有两个网卡,也就是说它会有两个 IP 地址,所以服务器 C得区分一个请求从哪个网卡进来,以便返回响应消息。

 

事实上只有一块网卡的时候也是可以绑定多个 IP 地址的,这是大家需要注意的。

源端口号:服务器 C 返还消息时使用,例如服务器 C 返还给 B 的响应消息,即使来自同一个主机,也需要放入不同浏览器页面的套接字。

因此 C 必须区分来自同一主机不同浏览器窗口的请求。

源 IP 地址:A 和 C 的浏览器页面即使使用了相同的端口号,但这两个连接有不同的源IP 地址,C 也需要进行正确地区分。 


 

3 Web 服务器与 TCP


 运行 Web 服务器的主机,通常在端口 80 监听请求。当客户机(如浏览器)向服务器发送报文段时,所有报文段的目的端口都为 80。如前所述,服务器能够根据源 IP 地址和源端口号来区分来自不同客户机的报文段。

 

但是套接字与进程之间并非总是有着一一对应的关系。事实上,Web 服务器通常一个服务进程可以为每个新的客户机连接创建一个具有新连接套接字的线程。显然,对于这样的服务器,在任意给定的时间内都可能有很多套接字(具有不同的标识)连接到同一个进程

 

 

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值