一. 体系结构
由高到低
- OSI七层体系结构
- 应用层
- 表示层
- 会话层
- 运输层
- 网络层
- 数据链路层
- 物理层
- TCP/IP四层体系结构
- 应用层(各种应用协议如TELNET, FTP, SMTP等)
- 运输层(TCP或者UDP)
- 网际层(IP)
- 网络接口层(数据链路层,物理层)
- 五层协议的体系结构
- 应用层
- 运输层
- 网络层
- 数据链路层
- 物理层
二. 各层介绍
1. 应用层:
应用层是体系结构中的最高层,直接为用户的应用进程(正在运行的程序)提供服务 。在因特网中的应用层协议很多,如支持万维网应用的HTTP协议,支持文件传输的FTP协议,支持电子邮件的SMTP协议等等。
2. 运输层:
运输层的任务是负责向两个主机中进程之间的通信提供服务。由于一个主机可同时运行多个进程,因此运输层有复用和分用的功能。复用就是多个应用层进程可以同时使用下面运输层的服务,分用则是运输层把收到的信息分别交付给上面应用层中的相应的进程。
运输层主要使用两种协议:
- 传输控制协议 TCP(Transmission Control Protocol)----面向连接的,数据传输的单位是报文段(segment),能够提供可靠的交付
- 用户数据报协议 UDP(User Datagram Protocol)----无连接的,数据传输的单位是用户数据报,不保证提供可靠的交付,只能“尽最大努力交付(best-effort delivery)“。
3. 网络层:
网络层负责为分组交换网上的不同主机提供通信服务。在发送数据的时候,网络层把运输层产生的报文段或者用户数据报封装成分组或包进行传送。在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫IP数据报,或简称数据报。
无论在哪一层传送的数据单元,习惯上都可以笼统地用“分组”来表示
因特网是一个很大的互联网,它由大量的异构网络通过路由器(router)相连接。因特网主要的网络层协议是无连接的网际协议IP和许多种路由选择协议,所以因特网的网络层也叫网际层或者IP层。
4. 数据链路层:
简称链路层。两个主机之间的数据传输总是在一段一段的链路上传送的,也就是说,在两个相邻结点之间(主机和路由器之间或者两个路由器之间)传送数据是直接传送的(点对点)。这时就需要使用专门的链路层的协议。 在两个相邻结点之间传送数据时,数据链路层把网络层交下来的IP数据报组装成帧(frame),在两个相邻结点间的链路上“透明”的传送帧中的数据。每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错控制等)。典型的帧长是几百字节到一千多字节。
透明:某一个实际存在的事物看起来却好像不存在一样。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束,还使接收端能够检测到所收到的帧中有无差错,如发现错误,数据链路层就简单地丢弃这个出了差错的帧,以免继续浪费网络资源。如需改错,则交给运输层的TCP协议完成。
5. 物理层:
在物理层上传输数据的单位是比特。物理层的任务就是透明地传送比特流。
在因特网所使用的各种协议中,最重要的和最著名的就是TCP和IP两个协议。现在人们经常提起的TCP/IP并不一定是单指TCP和IP这两个具体的协议,而是表示因特网所使用的整个TCP/IP协议族(Protocol suite)
三. TCP的运输连接管理(三次握手)
TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。因此,运输连接就有三个阶段:连接建立、数据传送和连接释放。运输连接的管理就是使运输连接的建立和释放都能正常地进行。
在TCP建立连接的过程中要解决三个问题:
- 要使每一方能够确知对方的存在
- 要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)
- 能够对实体资源(缓存大小、连接表中的项目等)进行分配
TCP连接的建立采用客户服务器方式。主动发起连接建立的应用进程叫做客户(Client),被动等待连接建立的应用程序叫做服务器(Server)。
假设主机A运行的是TCP客户程序,主机B运行TCP服务器程序。最初两端的TCP进程都处在CLOSED(关闭)状态。
A主动打开连接,而B被动打开连接。
B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器就处于LISTEN(收听)状态,等待客户的连接请求,如有,即作出反应。
过程1.
A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文段,——>首部中的同步位 SYN = 1,同时选择一个初始序号 seq = x,——>TCP客户进入SYN-SENT(同步以发送)状态。
注:TCP规定,SYN报文段(即SYN = 1的报文段)不能携带数据,但要消耗掉一个序号。
过程2.
B收到连接请求报文段后,如同意建立连接,则向A发送确认。——>在确认报文段中把SYN位和ACK位都置1,确认号是ack = x+1,同时也为自己选择一个初始序号seq = y。(注:该确认报文段也不能携带数据,但同样要消耗掉一个序号。)——>这时,TCP服务器进程进入SYN-RCVD(同步收到)状态。
过程3.
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
假定A发出连接请求,但因连接请求报文丢失而未收到确认,于是A再重传一次连接请求,后来收到了确认,建立了连接,数据传输完毕后就释放了连接。这个过程中,A共发送了两个请求报文段,其中第一个丢失,第二个到达了B。
于是就可能有“已失效的连接请求报文段产生”:假定一种异常的情况,即A发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间的滞留了,以致延误到第二个请求报文段连接释放以后的某个时间才到达B。本来这是一个已失效的报文段。但B收到此失效的连接请求报文段后,就误以为A又一次发出了一次新的连接请求,于是就向A发送确认报文段,同意建立连接请求。假如不采用三次握手,那么只要B发出确认,新的连接就建立了。
由于现在A并没有发出建立连接的请求,所以不会理睬B的确认,也不会向B发送数据,但是B却以为新的运输连接已经建立了,并一直等待A发来数据。于是,B的许多资源就这样被白白浪费了。
采用三次握手,A 不会向 B 的确认发出确认,B由于收不到确认,就知道A并没有要求要建立连接。
网友评论