4176 2018-03-11 2020-06-25
前言:计算机网络方面的知识,对程序员来说是不可或缺的。
一、体系结构
1、OSI体系结构
开放系统互连基本参考模型OSI/RM(Open Systems Interconnection Reference Model),简称OSI。虽然OSI的七层协议体系结构概念很清楚,理论也比较完整,但它既复杂又不实用。
2、TCP/IP体系结构
TCP/IP体系结构则不同,它现在已经得到了非常广泛的应用。TCP/IP是一个四层的体系机构,它包含应用层、运输层、网际层和网络接口层(用网际层这个名字是强调这一层是为了解决不同网络的互连问题)。
不过从实质上讲,TCP/IP只有最上面的三层,因为最下面的网络接口层基本上和一般的通信链路在功能上没有多大差别,对于计算机网络来说,这一层并没有什么特别新的具体内容。因此在学习计算机网络的原理时,往往采取折中的办法,即综合OSI和TCP/IP的优点,采用一种只有五层协议的体系结构,如下图
自上而下地、非常简要地介绍一下各层的主要功能。其中
1、应用层
应用层(application layer)是体系结构中的最高层。应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间通信和交互的规则。这里的进程(process)就是指主机中正在运行的程序。对于不同的网络应用需要不同的应用层协议。在因特网中的应用层协议很多,如支持万维网应用的HTTP协议、支持电子邮件的SMTP协议,支持文件传送的FTP协议等等。我们将应用层交互的数据单元称为报文(message)。
通俗的理解就是,应用层保证遵从特定的协议的数据将会从特定端口发出或被特定端口接受。
2、运输层
运输层(transport layer)的任务就是负责向两个主机中进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。所谓通用,是指并不针对某个特定网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个进程,因此运输层有复用和分用的功能。复用就是多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。
通俗的理解就是,运输层保证端口到端口之间的正常通信,这里主要使用的协议是TCP和UDP两种。
运输层主要使用以下两种协议:
- 传输控制协议TCP(Transmission Control Protocol):提供面向连接的、可靠的数据传输服务,其数据传输的单位是报文段(segment)。
- 用户数据报协议UDP(User Datagram Protocol):提供无连接的、尽最大努力(best-effort)的数据传输服务(不保证数据传输的可靠性),其数据传输的单位是用户数据报。
3、网络层
网络层(network layer)负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报分装成分组或包(packet)进行传送。在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫做IP数据报,或简称为数据报(datagram)。
网络层的另一个任务就是选择合适的路由,使源主机运输层所传下来的分组能够通过网络中的路由器找到目的主机。这里要强调指出,网络层的“网络”二字,已不是我们通常谈到的具体的网络,而是在计算机网络体系结构模型中的专用名词。
因特网是一个很大的互联网,它有大量的异构(heterogeneous)网络通过路由器(router)相互连接起来。因特网主要的网络层协议是无连接的网际协议IP(Internet Protocol)和许多种路由选择协议,因此因特网的网络层也叫做网际层或IP层。
通俗的理解就是,网络层保证IP地址到IP地址之间的通信。
4、数据链路层
数据链路层(data link layer)常简称为链路层。我们知道,两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。在两个相邻节点之间的传送数据时,数据链路层将网络层交下来的IP数据报组装成帧(framing),在两个相邻节点间的链路上传送帧(frame)。每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错控制等)。
在接受数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可以从中提取出数据部分,上交给网络层。
控制信息还使接收端能够检测到所收到的帧中有无差错。如发现差错,数据链路层就简单地丢弃这个出了差错的帧,以免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在数据链路层传输时出现的差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠传输协议来纠正出现的差错。这种方法会使数据链路层的协议复杂些。
通俗的理解就是,数据链路层保证了主机与主机之间的数据交互,这里涉及到的有封装成帧、透明传输和差错检测。
5、物理层
在物理层(physical layer)上所传的数据的单位是比特。发送方发送1(或0)时,接收方应收到1(或0)而不是0(或1)。因此物理层要考虑用多大的电压代表“1”或“0”,以及接收方如何识别发送方所发送的比特。物理层还要确定连接电缆的插头应当有多少根引脚以及各种引脚应当如何连接。当然,解释比特代表的意思,就不是物理层的任务。请注意,传递信息所利用的一些物理媒体,如双绞线、同轴电缆、光缆、无线信道等,并不在物理层协议之内,而是在物理层协议的下面。因此也有人把物理媒体当作第0层。
通俗的理解就是,物理层保证了数据链路层的帧能被正确的编码、解码以便于发送和接受。
二、TCP和UDP
TCP/IP运输层的两个主要协议都是因特网的标准,即
- 用户数据报协议UDP(User Datagram Protocol)
- 传输控制协议TCP(Transmission Control Protocol)
1、UDP
用户数据包协议UDP只是在IP的数据报服务增加了很少一点的功能,这就是复用和分用的功能以及差错检测的功能。UDP的主要特点是:
- UDP是无连接的,即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。
- UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表(这里面有许多参数)。
- UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文,如图2-1所示。在接受方的UDP,对IP层交上来的UDP用户数据报,在去除首部后就原封不动地交付上传的应用进程。也就是说,UDP一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文。若报文太长,UDP把它交给IP层后,IP层在传送时可能要进行分片,这会降低IP层的效率。反之,若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太大,这也降低了IP层的效率。
- UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很多的实时应用(如IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但却不允许数据有太大的延迟。UDP正好符合这种要求。
- UDP支持一对一、一对多、多对一和多对多的交互通信。
- UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
使用UDP协议的各种应用和应用层协议如下:
应 用 | 应用层协议 | 运输层协议 | 端口 |
---|---|---|---|
名字转换 | DNS(域名系统) | UDP | 53 |
文件传送 | TFTP(简单文件传送协议) | UDP | 69 |
路由选择协议 | RIP(路由信息协议) | UDP | - |
IP地址配置 | DHCP(动态主机配置协议) | UDP | - |
网络管理 | SNMP(简单网络管理协议) | UDP | 161 |
远程文件服务器 | NFS(网络文件系统) | UDP | - |
IP电话 | 专用协议 | UDP | - |
流式多媒体通信 | 专用协议 | UDP | - |
多播 | IGMP(网际组管理协议) | UDP | - |
2、TCP
TCP是TCP/IP体系中非常复杂的一个协议。下面介绍TCP的最主要的特点。
- TCP是面向连接的运输层协议。这就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。也就是说,应用进程之间的通信好像在“打电话”:通话前要先拨号建立连接,通话结束要挂机释放连接。
- 每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点的(一对一)。
- TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达。
- TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接受时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
- 面向字节流。TCP中的“流”(stream)指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。TCP不保证接收方应用程序所受到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。但接收方应用程序收到的字节流必须和发送方发出的字节流完全一样。下图是上述概念的示意图
使用TCP协议的各种应用和应用层协议如下:
应 用 | 应用层协议 | 运输层协议 | 端口 |
---|---|---|---|
电子邮件 | SMTP(简单邮件传送协议) | TCP | 25 |
远程终端接入 | TELNET(远程终端协议) | TCP | 23 |
万维网 | HTTP(超文本传送协议) | TCP | 80 |
文件传送 | FTP(文件传送协议) | TCP | 21 |
三、TCP的连接
1、建立连接
图3-1画出了TCP的建立连接的过程。假定主机A运行的是TCP客户程序,而B运行TCP服务器程序。最初两端的TCP进程都处于CLOSED(关闭)状态。图中在主机下面的方框分别是TCP进程所在的状态。请注意,A主动打开连接,而B被动打开连接。
B的TCP服务器进程先创建传输控制块TCB(Transmission Control Block),准备接受客户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。如有,即做出响应。
A的TCP客户进程也是首先创建传输控制块TCB,然后向B发出连接请求报文段,这时首部中的同步位SYN = 1,同时选择一个初始序号seq = x。TCP规定,SYN报文段(即SYN = 1的报文段)不能携带数据,但要消耗掉一个序号。这时,TCP客户进程进入SYN-SENT(同步已发送)状态。
B收到连接请求报文段后,如同意建立连接,则向A发送确认呢。在确认报文段中应把SYN位和ACK位都置1,确认号是ack = x + 1,同时也为自己选择一个初始序号seq = y。请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。这是TCP服务器进程进入SYN-RCVD(同步收到)状态。
TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack = y + 1,而自己的序号seq = x + 1。TCP的标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq = x + 1。这时,TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。
当B收到A的确认后,也进入ESTABLISHED状态。
上面给出的连接建立过程叫做三次握手(three-way handshake)。
为什么A还要发送一次确认呢?这主要是为了防止已失效的连接请求报文段突然又传到了B,因而产生错误。
2、释放连接
TCP连接释放过程比较复杂,总的来讲,TCP的连接释放在三次握手的基础上采用四次握手机制:任何一方都可以在数传送结束后发出连接释放通知,待对方确认后就进入半关闭状态。当另一方也没有数据再发送时,则发送连接释放通知,对方确认后就完全关闭了TCP连接(总共经历四次)。大致过程如下图
四、网际协议IP
网际协议IP是TCP/IP体系中两个最主要的协议之一,也是最重要的因特网标准协议之一。与IP协议配套使用的还有三个协议:
- 地址解析协议ARP(Address Resolution Protocol)
- 网际控制报文协议ICMP(Internet Control Message Protocol)
- 网际组管理协议IGMP(Internet Group Management Protocol)
未完待续....
总访问次数: 298次, 一般般帅 创建于 2018-03-11, 最后更新于 2020-06-25
欢迎关注微信公众号,第一时间掌握最新动态!