OSI 七层模型
我们一般使用的网络数据传输由下而上共有七层,分别为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,也被依次称为 OSI 第一层、第二层、⋯⋯、 第七层。
各层功能简介
1.物理层(Physical Layer)
物理层位于 OSI 参考模型的最低层,它直接面向原始比特流的传输。为了实现原始比特流的物理传输,物理层必须解决好包括传输介质、信道类型、数据与信号之间的转换、信号传输中的衰减和噪声等在内的一系列问题。另外,物理层标准要给出关于物理接口的机械、 电气、功能和规程特性,以便于不同的制造厂家既能够根据公认的标准各自独立地制造设备,又能使各个厂家的产品能够相互兼容。实质上就是提供连接网络的硬件设备,将电脑连接起来的物理手段. 如光缆/电缆/无线电波。
2.数据链路层(Data Link Layer)
在物理层发送和接收数据的过程中,会出现一些物理层自己不能解决的问题。例如, 当两个节点同时试图在一条线路上发送数据时该如何处理?节点如何知道它所接收的数据 是否正确?如果噪声改变了一个分组的目标地址,节点如何察觉它丢失了本应收到的分组呢?这些都是数据链路层所必须负责的工作。数据链路层涉及相邻节点之间的可靠数据传输,数据链路层通过加强物理层传输原始比特的功能,使之对网络层表现为一条无错线路。为了能够实现相邻节点之间无差错的数据传送,数据链路层在数据传输过程中提供了确认、差错控制和流量控制等机制。
3.网络层(Network Layer)
网络中的两台计算机进行通信时,中间可能要经过许多中间结点甚至不同的通信子网。网络层的任务是:进行逻辑地址寻址,实现不同网络之间的路径选择。网络层建立了主机之间的通信,它在网络层引入了一套地址机制:网络地址.简称网址(Ip地址),我们可以通过Ip地址,可以找到唯一的一台计算机,通过主机MAC地址来接收和发送信息。
4.传输层(Transport Layer)
传输层是 OSI 七层模型中唯一负责端到端节点间数据传输和控制功能的层。传输层是 OSI 七层模型中承上启下的层,它下面的三层主要面向网络通信,以确保信息被准确有效地传输;它上面的三层则面向用户主机,为用户提供各种服务。传输层通过:定义传输数据的协议端口号,以及流控和差错效验,定义了端口和端口之间的通信,帮助我们使不同的应用程序能够接收到自己所需要的的数据。
5.会话层(Session Layer)
会话层的功能是:包括建立、管理、终止会话,用来建立和管理应用程序之间的通信,实现自动寻址,自动收发数据。
6.表示层(Presentation Layer)
表示层以下的各层只关心可靠的数据传输,而表示层关心的是所传输数据的语法和语义。它主要涉及处理在两个通信系统之间所交换信息的表示方式,包括数据格式变换、数据加密与解密、数据压缩与恢复等功能。比如我们要用基于Unix系统的mac电脑给pc机发送数据,表示层为我们解决了通信间语法的问题。
7.应用层(Application Layer)
应用层是 OSI 参考模型的最高层,负责为用户的应用程序提供网络服务。与 OSI 其他层不同的是,它不为任何其他OSI层提供服务,而只是为OSI模型以外的应用程序提供服务。比如不同的文件类型要用不同的应用程序打开,应用层中就规定了不同应用程序的数据格式。
(其中,物理层、数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象;
传输层、会话层、表示层和应用层则被称作主机层,是用户所面向和关心的内容。)
OSI七层结构与TCP/IP四层结构对应关系:
OSI七层模型对应的协议:
7、应用层application——FTP、HTTP、DNS、SMTP、TELNET协议
6、表示层presentation——信息的语法定义以及它们的关联,如加密、解密、转换翻译、压缩解压缩
5、会话层session——不同机器上的用户之间建立及管理会话
4、传输层transport——TCP、UDP协议
3、网络层Internet——IP、ICMP协议
2、数据链路层link——ARP协议、RARP协议
1、物理层physical——机械、电子、定时接口通信道上的原始比特流传输
TCP/IP四层模型模型对应的协议:
4、应用层——FTP、HTTP、DNS、SMTP、TELNET协议
3、传输层——TCP、UDP协议
2、网络层——IP、ICMP、ARP协议、RARP协议
1、网络接口层——Ethernet 802.3、Token Ring 802.5、X.25、Frame relay、HDLC、PPP ATM等
1)应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区分不同的应用程序进程间的网络通信和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口(socket是操作系统提供出来的接口),区分不同应用程序进程间的网络通信和连接。
生成Socket,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过socket接口,区分来自不同应用程序进程间的网络通信和连接,实现数据传输的并发服务。
Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。
2)Host A上的程序A将一段信息写入Socket中,Socket的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。
要通过互联网进行通信,至少需要一对Socket,一个运行于客户机端,称之为ClientSocket,另一个运行于服务器端,称之为serverSocket。
根据连接启动的方式以及本地套接字要连接的目标,Socket之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是指serverSocket并不定位具体的ClientSocket,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由ClientSocket提出连接请求,要连接的目标是serverSocket。为此,ClientSocket必须首先描述它要连接的serverSocket,指出serverSocket的地址和端口号,然后就向serverSocket提出连接请求。
连接确认:是指当serverSocket监听到或者说接收到ClientSocket的连接请求,它就响应ClientSocket的请求,建立一个新的线程,把serverSocket的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而serverSocket继续处于监听状态,继续接收其他ClientSocket的连接请求。
3)而我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。通过Socket,我们才能更好地使用TCP/IP协议。实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等。网络有一段关于socket和TCP/IP协议关系的说法比较容易理解:“TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。”
IP TCP UDP HTTP
IP协议对应于网络层,TCP、UDP协议对应于传输层,而HTTP协议对应于应用层。
IP协议是网络层协议,是一种不可靠的、无连接的传送机制称为Internet协议,解决的是主机之间如何通信的问题
TCP、UDP是传输层协议,解决的是数据如何传输的问题
HTTP是应用层协议,解决的是数据如何包装的问题
Socket本身并不是协议,而是一个针对TCP或者IP的调用接口(API),解决的是区分不同的应用程序进程间的网络通信和连接,从而实现数据传输并发服务的问题
传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的。而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP协议或者IP协议的编程接口。
socket连接、TCP连接、UDP连接、HTTP连接?
创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP/UDP协议进行连接时,该Socket连接就是一个TCP连接/UDP连接。
通常情况下 Socket 连接就是TCP连接,因此 Socket 连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮流询问告诉网络,该连接处于活跃状态。
而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步,此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。
TCP和UDP的区别?
1、TCP是面向连接,可靠、稳定的,缺点:慢,效率低,占用系统资源高,容易被攻击。虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上)保证了连接的可靠性;
而UDP非面向连接,快,比TCP稍安全,缺点:不可靠、不稳定。UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。
2、也正由于1所说的特点,使得UDP的开销更小,数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。
知道了TCP和UDP的区别,就不难理解为何采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通信是不安全的,
因为程序员可以手动对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,
即使是这样,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”,而实现了TCP无法达到的传输效率。
3、TCP应用场景 如:浏览器使用HTTP,QQ文件传输等
4、UDP应用场景 如:QQ语音、QQ视频等
5、转发
TCP三次握手和四次挥手?
tcp三次握手
所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在 Socket 编程中,客户端执行connect()时,将触发三次握手。
首先了解一下几个标志,SYN(synchronous),同步标志,ACK (Acknowledgement),即确认标志,seq应该是Sequence Number,序列号的意思,另外还有四次握手的fin,应该是final,表示结束标志。
第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。
第二次握手:服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的序列号加1以,即X+1。
第三次握手:客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写序列号的+1。
tcp四次挥手
TCP连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
其实有个问题,为什么连接的时候是三次握手,关闭的时候却是四次挥手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,” 你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
tcp socket和udp socket的具体实现
常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的 Socket,针对于面向连接的TCP服务应用;数据报式 Socket 是一种非面向连接的 Socket ,对应于非面向连接的UDP服务应用。