一、OSI七层模型

1OSI

OSIOpen SystemInterconnect的缩写,意为开放式系统互联

 

OSI参考模型各个层次的划分遵循下列原则:

根据不同层次的抽象分层

每层应当有一个定义明确的功能

每层功能的选择应该有助于制定网络协议的国际标准。

各层边界的选择应尽量节省跨过接口的通信量。

层数应足够多,以避免不同的功能混杂在同一层中,但也不能太多,否则体系结构会过于庞大

同一层中的各网络节点都有相同的层次结构,具有同样的功能。

同一节点内相邻层之间通过接口(可以是逻辑接口)进行通信。

七层结构中的每一层使用下一层提供的服务,并且向其上层提供服务。

不同节点的同等层按照协议实现对等层之间的通信。

 


2、根据以上标准,OSI参考模型分为以下七层:

7应用层

6表示层

5会话层

4传输层

3网络层

2数据链路层

1物理层

 

每层对因功能协议:OSI、TCPIP模型,3次握手与4次挥手_Linux


3、七层详细介绍

7-应用层 网络进程访问应用层

为应用程序进程(电子邮件、文件传输和终端仿真)提供网络服务;

提供用户身份验证;

定义了用于在网络中进行通信和数据传输的接口 - 用户程式;
提供标准服务,比如虚拟终端、文件以及任务的传输和处理;
应用层为操作系统或网络应用程序提供访问网络服务的接口;

 

6-表示层 数据表示

确保接收系统可以读出该数据;格式化数据;构建数据;

协商用于应用层的数据传输语法;

提供加密;

掩盖不同系统间的数据格式的不同性;
这一层主要解决拥护信息的语法表示问题。它将欲交换的数据从适合于某一用户的抽象语法,转换为适合于OSI系统内部使用的传送语法。即提供格式化的表示和转换数据服务。数据的压缩和解压缩,加密和解密等工作都由表示层负责。

 

5-会话层 主机间通信

建立、管理和终止在应用程序之间的会话;
控制用户间逻辑连接的建立和挂断;
报告上一层发生的错误;
这一层也可以称为会晤层或对话层,在会话层及以上的高层次中,数据传送的单位不再另外命名,而是统称为报文。会话层不参与具体的传输,它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制。如服务器验证用户登录便是由会话层完成的。

 

4-传输层 传输问题

建立、维护和终止虚拟电路

信息流控制来保障可靠性

管理网络中端到端的信息传送;
通过错误纠正和流控制机制提供可靠且有序的数据包传送;
提供面向无连 接的数据包的传送;

4层为上层提供端到端(最终用户到最终用户)的透明的、可靠的数据传输服务。所为透明的传输是指在通信过程中传输层对上层屏蔽了通信传输系统的具体细节。

 

3-网络层 数据传输

选择传的数据的最佳路径

支持逻辑寻址和路径选择

定义网络设备间如何传输数据;
根据唯一的网络设备地址路由数据包;
提供流和拥塞控制以防止网络资源的损耗
在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点,确保数据及时传送。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息- -源站点和目的站点地址的网络地址。如果你在谈论一个IP地址,那么你是在处理第3层的问题,这是数据包问题,而不是第2层的IP是第3层问题的一部分,此外还有一些路由协议和地址解析协议(ARP)。有关路由的一切事情都在这第3层处理。地址解析和路由是3层的重要目的。网络层还可以实现拥塞控制、网际互连等功能。在这一层,数据的单位称为数据包(packet)

 

2-数据链路层 访问介质

定义如何格式化数据以便进行传输以及如何控制对网络的访问

支持错误检测

定义操作通信连接的程序;
封装数据包为数据帧;
监测和纠正数据包传输错误
在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,并进行各电路上的动作系列。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,数据的单位称为帧(frame)

 

1-物理层 二进制传输

为启动、维护以及关闭物理链路定义了电气规范、机械规范、过程规范和功能规范;

定义通过网络设备发送数据的物理方式;
作为网络媒介和设备间的接口;
规定通信设备的机械的、电气的、功能的和过程的特性,用以建立、维护和拆除物理链路连接。具体地讲,机械特性规定了网络连接时所需接插件的规格尺寸、引脚数量和排列情况等;电气特性规定了在物理连接上传输bit流时线路上信号电平的大小、阻抗匹配、传输速率距离限制等;功能特性是指对各个信号先分配确切的信号含义,即定义了DTEDCE之间各个线路的功能;规程特性定义了利用信号线进行bit流传输的一组操作规程,是指在物理连接的建立、维护、交换信息是,DTEDCE双放在各电路上的动作系列。在这一层,数据的单位称为比特(bit)

 

4PDU

PDU: Protocol Data Unit,协议数据单元是指对等层次之间传递的数据单位

 物理层的PDU是数据位 bit

 数据链路层的PDU是数据帧 frame

 网络层的PDU是数据包 packet

 传输层的PDU是数据段 segment

 其他更高层次的PDU是消息 message

 

对等通信:

OSI、TCPIP模型,3次握手与4次挥手_Linux_02


二、TCP/IP

1、分层

TCP/IP(传输控制协议/网间网协议)是目前世界上应用最为广泛的协议,它的流行与Internet的迅猛发展密切相关。

TCP/IP最初是为互联网的原型ARPANET所设计的,目的是提供一整套方便实用、能应用于多种网络上的协议,事实证明TCP/IP做到了这一点,它使网络互联变得容易起来,并且使越来越多的网络加入其中,成为Internet的事实标准。

TCP/IP协议族包含了很多功能各异的子协议。为此我们也利用上文所述的分层的方式来剖析它的结构。共定义了四层,和ISO参考模型的分层有对应关系。

分层:

4 应用层

3 传输层

2 Internet

1 网络访问层


对应关系:

OSI、TCPIP模型,3次握手与4次挥手_Linux_03



2、各层功能

OSI、TCPIP模型,3次握手与4次挥手_Linux_04

TCP(Transmission Control Protocol:传输控制协议)UDP(UserDatagram Protocol:用户数据报协议)协议属于传输层协议。其中:

1TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;

2UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。

 

应用层

应用层是所有用户所面向的应用程序的统称。ICP/IP协议族在这一层面有着很多协议来支持不同的应用,许多大家所熟悉的基于Internet的应用的实现就离不开这些协议。如我们进行万维网(WWW)访问用到了HTTP协议、文件传输用FTP协议、电子邮件发送用SMTP、域名的解析用DNS协议、远程登录用Telnet协议等等,都是属于TCP/IP应用层的;就用户而言,看到的是由一个个软件所构筑的大多为图形化的操作界面,而实际后台运行的便是上述协议。

 

传输层

这一层的的功能主要是提供应用程序间的通信,TCP/IP协议族

在这一层的协议有TCPUDP

 

网络层

TCP/IP协议族中非常关键的一层,主要定义了IP地址格式,从而能够使得不同应用类型的数据在Internet上通畅地传输,IP协议就是一个网络层协议。

 

网络接口层

这是TCP/IP软件的最低层,负责接收IP数据包并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。

 


3TCP协议格式

TCP的包头如图:

OSI、TCPIP模型,3次握手与4次挥手_Linux_05

 源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个。

      序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0开始。

      确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号。

      数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离TCP 报文段的起始处有多远。该字段的单位是32(4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节。


  URG表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效

  ACK表示是否前面的确认号字段是否有效。ACK=1,表示有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,ACK标志的TCP报文段称为确认报文段

  PSH判断是否存到缓冲区。提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中

  RST重新建立连接。如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段

  SYN请求位。在建立连接时使用,用来同步序号。当SYN=1ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段

  FIN分手位。表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段

 

窗口大小:表示现在充许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量

  校验和:提供额外的可靠性

  紧急指针:标记紧急数据在数据字段中的位置

  选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节

 


4、三次握手

TCP的运输连接有三个阶段,即连接建立、数据传送、连接释放。

TCP连接建立的过程要使每一方能够确定对方的存在:主动发起连接建立的应用进行叫做客户(client),被动等待连接建立的应用进程叫做服务器(server),连接建立的过程叫做三次握手。

 

首先要知道这些英文含义:

1.序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。表示发送第几个包。

2.确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。(意思就是,收到你的第seq个包了,下次请发送第ack个包。)

3.标志位:共6个,即URGACKPSHRSTSYNFIN。前面已经说过,这里再说一下大体含义:

URG:紧急指针(urgent pointer)有效。

ACK:确认序号有效。

PSH:接收方应该尽快将这个报文交给应用层。

RST:重置连接。

SYN:发起一个新连接。

FIN:释放一个连接。

 

再来看看如何建立连接的:

首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

OSI、TCPIP模型,3次握手与4次挥手_Linux_06

 

1、第一次握手:Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给ServerClient进入SYN_SENT状态,等待Server确认。

2、第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYNACK都置为1ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

3、第三次握手:Client收到确认后,检查ack是否为x+1ACK是否为1,如果正确则将标志位ACK置为1ack=y+1,并将该数据包发送给ServerServer检查ack是否为y+1ACK是否为1,如果正确则连接建立成功,ClientServer进入ESTABLISHED状态,完成三次握手,随后ClientServer之间可以开始传输数据了。

 


5、四次挥手

连接的释放需要发送四个包,因此成为“四次挥手”,四次挥手断开连接。客户端或服务器都可以主动发起挥手动作。

由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这好比,我们打电话(全双工),正常的情况下(出于礼貌),通话的双方都要说再见后才能挂电话,保证通信双方都把话说完了才挂电话。

这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

OSI、TCPIP模型,3次握手与4次挥手_Linux_07

1、第一次挥手:Client发送一个FIN,用来关闭ClientServer的数据传送,Client进入FIN_WAIT_1状态。

2、第二次挥手:Server收到FIN后,发送一个ACKClient,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

3、第三次挥手:Server发送一个FIN,用来关闭ServerClient的数据传送,Server进入LAST_ACK状态。

4、第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACKServer,确认序号为收到序号+1Server进入CLOSED状态,完成四次挥手。

 

6、状态序列

有限状态机FSM:FiniteState Machine

CLOSED 没有任何连接状态

LISTEN 侦听状态,等待来自远方TCP端口的连接请求

 SYN-SENT 在发送连接请求后,等待对方确认

 SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认

 ESTABLISHED 代表传输连接建立,双方进入数据传送状态

 FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认

 FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求

 TIME-WAIT 完成双向传输连接关闭,等待所有分组消失

 CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认

 LAST-ACK  被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失

 CLOSING 双方同时尝试关闭传输连接,等待对方确认

 

客户机端的三次握手和四次挥手:

OSI、TCPIP模型,3次握手与4次挥手_Linux_08


服务器端的三次握手和四次挥手:

OSI、TCPIP模型,3次握手与4次挥手_Linux_09


7Q&A

为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

  这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACKSYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACKFIN一般都会分开发送。

 

为什么 TIME_WAIT状态还需要等 2MS L后才能返回到 CLOSED 状态?

  这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到 CLOSED 状态(就好比从 SYN_SEND 状态到 ESTABLISH 状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的 ACK 报文会一定被对方收到,因此对方处于 LAST_ACK 状态下的 SOCKET 可能会因为超时未收到 ACK 报文,而重发 FIN 报文,所以这个 TIME_WAIT 状态的作用就是用来重发可能丢失的 ACK 报文。


(注:部分内容来源于网络)