前言
这篇文章实话说我有点虚,因为平时都不怎么研究这一块的,然后涉及到的知识点超多,我只能到处看看资料总结一下相关信息,所以在此我只想说句:
本文章内容只代表个人立场,有错必改!
原本打算一次性总结,后来越扯越多超过字数限制了,就干脆做成网络系列文章了,不定时更新原有内容(发现哪里出错的话),不定时新增系列文章,请见谅!
因为之前写得太臃肿又不够详细,最近刚好复习到这一块的内容,所以决定把这些文章都拆分成更加细致一点,补充详细内容,优化排版布局,目前来看还是应该的.
网络协议系列 — TCP、UDP、SOCKET与参考模型
OSI参考模型(来自百度百科)
开始进入正题之前先插个知识点,让大家对HTTP,TCP,UDP的底层构成有些抽象认识各负责什么功能。
OSI(Open System Interconnect),即开放式系统互联。该体系结构标准定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层),即ISO开放系统互连参考模型。在这一框架下进一步详细规定了每一层的功能,以实现开放系统环境中的互连性、互操作性和应用的可移植性。
物理层(Physical Layer)
物理层是OSI参考模型的最低层,它利用传输介质为数据链路层提供物理连接。它主要关心的是通过物理链路从一个节点向另一个节点传送比特流,物理链路可能是铜线、卫星、微波或其他的通讯媒介。它关心的问题有:多少伏电压代表1?多少伏电压代表0?时钟速率是多少?采用全双工还是半双工传输?总的来说物理层关心的是链路的机械、电气、功能和规程特性。
数据链路层(Data Link Layer)
数据链路层是为网络层提供服务的,解决两个相邻结点之间的通信问题,传送的协议数据单元称为数据帧。
数据帧中包含物理地址(又称MAC地址
)、控制码、数据及校验码等信息。该层的主要作用是通过校验、确认和反馈重发等手段,将不可靠的物理链路转换成对网络层来说无差错的数据链路。
此外,数据链路层还要协调收发双方的数据传输速率,即进行流量控制,以防止接收方因来不及处理发送方来的高速数据而导致缓冲器溢出及线路阻塞。
网络层(Network Layer)
网络层是为传输层提供服务的,传送的协议数据单元称为数据包或分组。该层的主要作用是解决如何使数据包通过各结点传送的问题,即通过路径选择算法(路由)将数据包送到目的地。另外,为避免通信子网中出现过多的数据包而造成网络阻塞,需要对流入的数据包数量进行控制(拥塞控制)。当数据包要跨越多个通信子网才能到达目的地时,还要解决网际互连的问题。
传输层(Transport Layer)
传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。
传输层传送的协议数据单元称为段或报文。
会话层(Session Layer)
会话层主要功能是管理和协调不同主机上各种进程之间的通信(对话),即负责建立、管理和终止应用程序之间的会话。会话层得名的原因是它很类似于两个实体间的会话概念。例如,一个交互的用户会话以登录到计算机开始,以注销结束。
表示层(Presentation Layer)
表示层处理流经结点的数据编码的表示方式问题,以保证一个系统应用层发出的信息可被另一系统的应用层读出。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据表示格式转换成网络通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。
应用层(Application Layer)
应用层是OSI参考模型的最高层,是用户与网络的接口。该层通过应用程序来完成网络用户的应用需求,如文件传输、收发电子邮件等。
具体通俗流程图
(更多内容请自行查阅,本节到此为止了。)
五层因特网协议栈
因特网协议栈共有五层:应用层、传输层、网络层、链路层和物理层。不同于OSI七层模型这也是实际使用中使用的分层方式。
因特网没有表示层、会话层这两个,留给应用开发者处理,需要定义哪些功能。
TCP/IP参考模型
当无线网络和卫星出现以后,现有的协议在和它们相连的时候出现了问题,所以需要一种新的参考体系结构。这个体系结构在它的两个主要协议出现以后,被称为TCP/IP参考模型(TCP/IP reference model)。
TCP/IP是一组用于实现网络互连的通信协议。Internet网络体系结构以TCP/IP为核心。基于TCP/IP的参考模型将协议分成四个层次,它们分别是:网络访问层、网际互联层、传输层(主机到主机)、和应用层。
网络接入层(即主机-网络层)
网络接入层与OSI参考模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接。地址解析协议(ARP)工作在此层,即OSI参考模型的数据链路层。
网际互联层
网际互联层对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。注重重新赋予主机一个IP地址来完成对主机的寻址,它还负责数据包在多种网络中的路由。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。
IP协议是网际互联层最重要的协议,它提供的是一个可靠、无连接的数据报传递服务。
传输层(Transport Layer)
传输层对应于OSI参考模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP)。
TCP协议提供的是一种可靠的、通过“三次握手
”来连接的数据传输服务;而UDP协议提供的则是不保证可靠的(并不是不可靠)、无连接的数据传输服务。
应用层(Application Layer)
应用层是OSI参考模型的最高层,是用户与网络的接口。该层通过应用程序来完成网络用户的应用需求,如文件传输、收发电子邮件等。
具体流程图
(还没太懂也懒,直接百度图片找张清晰的拿来用的。。)
两者主要区别在于: OSI参考模型虽然被看好,由于没把握好时机,技术不成熟,实现困难;相反,TCP/IP参考模型虽然有许多不尽人意的地方,但还是比较成功的。
(更多内容请自行查阅,本节到此为止了。)
区别
TCP
TCP(Transmission Control Protocol 传输控制协议
)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP
)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
UDP
UDP协议全称是用户数据报协议
,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。
对比
TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用,通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。
- TCP支持的应用协议主要有:Telnet、FTP、SMTP等;
- UDP支持的应用层协议主要有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
比较 | TCP | UDP |
---|---|---|
面向连接 | 是 | 否 |
连接端 | 点对点 | 一对一,一对多,多对一和多对多的交互通信 |
模式 | 流模式 | 数据报模式 |
传输可靠性 | 可靠 | 非可靠 |
数据顺序 | 保证 | 不保证 |
数据正确性 | 保证 | 可能丢包 |
速度 | 慢 | 快 |
什么是面向连接?
在互通之前TCP会通过三次握手建立连接,而UDP就不会这么干。所谓的建立连接是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向连接的特性。
上面说过,TCP提供的数据无差错、不丢失、不重复、并且按序到达。而UDP做不到。
什么是传输可靠性?
TCP是有状态维护的,它知道自己发了什么,发给谁,应该接收什么等等。而UDP发了之后恕不负责。
什么是数据顺序和正确性?
TCP会根据网络情况自动调整自己的行为,例如可能包丢了,可能网络不好等等,它具有拥塞控制保证一定是按顺序接收到的。而UDP不管,像流水线工人一样,应用给它什么它就发什么,至于后面的人有没拿到会不会出问题不管!
UDP适用场景
- 需要资源少、网络情况较好的内网或者对于丢包不敏感的场景。
- 不需要一对一建立连接沟通,而是可以直接广播。
- 需要处理速度快延迟低可接受少数丢包。
例如:
流媒体协议
如果直播软件使用基于TCP(例如RTMP协议),因为TCP的拥塞控制严格保证顺序导致只有上一个包收到才会继续确认下一个包,否则即使已经接收到了也会在缓存里等着。而对于直播来说以前的视频帧丢了也就丢了,一点都不重要,它们追求的是实时性而不是忍着卡顿看完整版。所以很多直播都是基于UDP实现自己的视频传输协议。
网络游戏
现在电竞游戏已经产业化,职业化,世界化了,你们会看到很多人已经对网络甚至键盘鼠标的要求之高。毫秒的延迟可能就是生与死的时差。
实时游戏中客户端和服务端要建立长连接保证传输,由于维护TCP连接需要在内核中维护一些数据结构所以一台机器能支持的TCP连接数是有限的,而不需要的连接的UDP在异步I/O机制引入之前常常是应对海量客户端连接的策略。
另一个还是TCP拥塞控制的问题,一般客户端会把鼠标和键盘的参数发给服务端,等它处理完所有用户的场景之后就返回给客户端解析渲染,一是如果数据包这么多游戏场景不强制需要全部也不要求顺序,二是那一瞬间的信息和这一瞬间的信息没什么关联了。
Socket(套接字)
Socket对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个Socket就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,Socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
Socket是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将Socket看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。Socket存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。Socket通常和同一个域中的Socket交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
Socket可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个Socket都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket中,该 Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的 Socket中,使对方能够接收到这段信息。 Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。
表示方法
点分十进制的lP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定
lP:端口号
主要类型
- 流套接字(SOCK_STREAM)
流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议
- 数据报套接字(SOCK_DGRAM)
数据报套接字提供一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理
- 原始套接字(SOCK_RAW)
原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接
连接过程
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:
- 服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
- 客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
- 连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
主要特点
根据套接字的不同类型,可以将套接字调用分为面向连接服务和无连接服务
- 面向连接服务
1) 数据传输过程必须经过建立连接、维护连接和释放连接3个阶段
2) 在传输过程中,各分组不需要携带目的主机的地址
3) 可靠性好,但由于协议复杂,通信效率不高
- 面向无连接服务
1) 不需要连接的各个阶段
2) 每个分组都携带完整的目的主机地址,在系统中独立传送
3) 由于没有顺序控制,所以接收方的分组可能出现乱序、重复和丢失现象
4) 通信效率高,但可靠性不能确保
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。