Date: 2019-06-10
Author: Sun
一. 网络模型
网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。
作为一个 开发程序员,知道网络到底是怎么进行通信的,怎么进行工作的,为什么服务器能够接收到请求,做出响应。这些原理应该是每个程序员应该了解的。
1.历史及起源
网络模型不是一开始就有的,在网络刚发展时,网络协议是由各互联网公司自己定义的,比如那时的巨头网络公司 IBM、微软、苹果、思科等等,他们每家公司都有自己的网络协议,各家的协议也是不能互通的,那时候大家觉得这是可以的,但对消费者来说这实际上是技术垄断,因为你买了苹果的设备就不能用微软的设备,因为他们的协议不是一样的,没有统一的标准来规范网络协议,都是这些公司的私有协议。
2. 网络模型与协议
2.1 TCP/IP协议
TCP/IP(Transmission Control Protocal/Internet Protocal,传输控制协议/网间网协议)是目前世界上应用最为广泛的网络通信协议,它的流行与Internet的迅猛发展密切相关。TCP/IP最初是为互联网的原型ARPANET所设计的,目的是提供一整套方便实用、能应用于多种网络上的协议,事实证明TCP/IP做到了这一点,它使网络互联变得容易起来,并且使越来越多的网络加入其中,成为Internet的事实标准。日常生活中的大部分网络应用(如浏览网页、收发电子邮件、QQ聊天)都是基于该系列协议。
为了减少协议设计的复杂性,大多数网络模型都是按层的方式来组织的。在分层网络模型中,每一层都为上一层提供一定的服务,而把如何实现本层服务的细节对上一层加以屏蔽。上层只需要知道下层提供了什么功能以及对应于这些功能的接口,而不必关心下一层如何实现这些功能。
2.2 OSI 模型和TCP/IP模型的对比
开放系统互连参考模型为实现开放系统互连所建立的通信功能分层模型,简称OSI模型。
其目的是为异种计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性和兼容性提供共同的参考。
但是由于种种原因,OSI模型始终没有得到广泛应用,当前普遍使用的是TCP/IP模型。
几乎所有的互联网设备都支持TCP/IP协议。TCP/IP协议已经成为事实上的国际标准和工业标准。
2.3 TCP/IP各层功能
(1)应用层:
应用层是所有用户所面向的应用程序的统称。ICP/IP协议族在这一层面有着很多协议来支持不同的应用,许多大家所熟悉的基于Internet的应用的实现就离不开这些协议。如我们进行万维网(WWW)访问用到了HTTP协议(超文本传输协议)、文件传输用FTP协议、电子邮件发送用SMTP(简单邮件传输协议)、域名的解析用DNS协议、远程登录用Telnet协议等等,还有近几年来十分流行的点对点共享文件协议,即BitTorrent协议,该协议基于HTTP协议。使用该协议构建的BT下载工具有比特精灵、BitTorrent等,都是属于TCP/IP应用层的;就用户而言,看到的是由一个个软件所构筑的大多为图形化的操作界面,而实际后台运行的便是上述协议。
(2)传输层:
传输层通过位于该层的TCP协议(传输控制协议)或UDP协议(用户数据报协议)在两台主机间传输数据。其中TCP协议提供可靠的面向连接的服务,它保证数据能完整地按顺序地传送到目标计算机。它在传输数据前首先需要和目的计算机建立连接,并且在数据传输过程中维持此链接,因此在速度上会有些损失。UDP提供简单的无连接服务,它不保证数据能按顺序、正确地传送到目的地(但可由他的上层来保证),它不用建立连接,通常速度上要比TCP快些。TCP协议和IP协议都需要网络层提供通往目的地的路由。传输层提供端到端,即应用程序之间的通信。该层的主要功能有差错控制、传输确认和丢失重传等。
(3)网络层:
网络层是TCP/IP协议族中非常关键的一层,主要定义了IP地址格式,从而能够使得不同应用类型的数据在Internet上通畅地传输,IP协议就是一个网络层协议。
网络层负责在发送端和接收端之间建立一条虚拟路径。IP协议并不保证数据能完整正确的到达目的地,这个任务由他上面的传输层来完成。这一层的ARP协议(地址解析协议)和RARP协议(反向地址解析协议)用于IP地址和物理地址(通常就是网卡地址)的相互转换。如果数据在传输过程中出现问题,该层的ICMP协议将生产错误报文。
(4)网络接口层:
这是TCP/IP软件的最低层,它包括多种逻辑链路控制盒媒体访问协议。负责将网络层发送来的数据分成帧,并通过物理链路进行传送,或从网络上接收物理帧,抽取数据并转交给其上的网络层.
2.4. ISO模型各层的功能
(1)应用层:
指网络操作系统和具体的应用程序,对应WWW服务器、FTP服务器等应用软件。术语“应用层”并不是指运行在网络上的某个特别应用程序,而是提供了一组方便程序开发者在自己的应用程序中使用网络功能的服务。应用层提供的服务包括文件传输(FTP)、文件管理以及电子邮件的信息处理(SMTP)等。
(2)表示层:
内码转换、压缩与解压缩、加密与解密,充当应用程序和网络之间的“翻译官”角色。在表示层,数据将按照网络能理解的方案进行格式化;这种格式化也因所使用网络的类型不同而不同。例如,IBM主机使用EBCDIC编码,而大部分PC机使用的是ASCII码。在这种情况下,便需要会话层来完成这种转换。表示层协议还对图片和文件格式信息进行解码和编码。表示层管理数据的解密与加密,如系统口令的处理。如果在Internet 上查询你银行账户,使用的即是一种安全连接。
(3)会话层:
负责在网络中的两节点之间建立和维持通信。功能包括:建立通信链接,保持会话过程通信链接的畅通,同步两个节点之间的对话,决定通信是否被中断以及通信中断时决定从何处重新发送 例:使用全双工模式或半双工模式,如何发起传输,如何结束传输,如何设定传输参数。会话层通过决定节点通信的优先级和通信时间的长短来设置通信期限。
(4)传输层:
编定序号、控制数据流量、查错与错误处理,确保数据可靠、顺序、无错地从A点到传输到B 点。因为如果没有传输层,数据将不能被接受方验证或解释,所以,传输层常被认为是O S I 模型中最重要的一层。传输协议同时进行流量控制或是基于接收方可接收数据的快慢程度规定适当的发送速率。传输层按照网络能处理的最大尺寸将较长的数据包进行强制分割并编号。例如:以太网无法接收大于1 5 0 0 字节的数据包。发送方节点的传输层将数据分割成较小的数据片,同时对每一数据片安排一序列号,以便数据到达接收方节点的传输层时,能以正确的顺序重组。该过程即被称为排序。在网络中,传输层发送一个A C K (应答)信号以通知发送方数据已被正确接收。如果数据有错或者数据在一给定时间段未被应答,传输层将请求发送方重新发送数据。
(5)网络层:
定址、选择传送路径。网络层通过综合考虑发送优先权、网络拥塞程度、服务质量以及可选路由的花费来决定从一个网络中节点A 到另一个网络中节点B 的最佳路径。在网络中,“路由”是基于编址方案、使用模式以及可达性来指引数据的发送。网络层协议还能补偿数据发送、传输以及接收的设备能力的不平衡性。为完成这一任务,网络层对数据包进行分段和重组。分段和重组 是指当数据从一个能处理较大数据单元的网络段传送到仅能处理较小数据单元的网络段时,网络层减小数据单元的大小的过程。重组是重构被分段的数据单元。
(6)数据链路层:
同步、查错、制定MAC方法。它的主要功能是将从网络层接收到的数据分割成特定的可被物理层传输的帧。帧(Frame)是用来移动数据的结构包,它不仅包括原始(未加工)数据,或称“有效荷载”,还包括发送方和接收方的网络地址以及纠错和控制信息。其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。通常,发送方的数据链路层将等待来自接收方对数据已正确接收的应答信号。数据链路层控制信息流量,以允许网络接口卡正确处理数据。数据链路层的功能独立于网络和它的节点所采用的物理层类型。
(7)物理层:
传输信息的介质规格、将数据以实体呈现并传输的规格、接头规格。该层包括物理连网媒介,如电缆连线、连接器、网卡等。物理层的协议产生并检测电压以便发送和接收携带数据的信号。尽管物理层不提供纠错服务,但它能够设定数据传输速率并监测数 例:在你的桌面P C 上插入网络接口卡,你就建立了计算机连网的基础。换言之,你提供了一个物理层。
二. 网络套接字
套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作
不同主机间的进程进行双向通信的端点,它构成了单个主机内及整个网络间的编程界面。套接
字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。 套 接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行
某种解释程序)。各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
四元组:(源IP,源端口,目的IP,目的端口)
1. 套接字工作原理
- 要通过互联网进行通信,你至少需要一对套接字,其中一个运行于客户机端,我们称之为
ClientSocket,另一个运行于服务器端,我们称之为ServerSocket。 - 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个
步骤:服务器监听,客户端请求,连接确认。 - 所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的
状态,实时监控网络状态。 - 所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接
字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的
地址和端口号,然后就向服务器端套接字提出连接请求。 - 所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它
就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦
客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他
客户端套接字的连接请求。
2. TCP和UDP网络通信过程
- TCP通信过程
- UDP通信过程
三. UDP 和 TCP 的区别
TCP | UDP | |
---|---|---|
连接性 | 面向连接 | 面向无连接 |
传输可靠性 | 可靠 | 不可靠 |
传输模式 | 流 | 数据报 |
应用场景 | 传输大量的数据 | 少量数据 |
速度 | 慢 | 快 |
TCP:
TCP 的可靠体现在传输数据之前,会有三次握手来建立连接。在数据传完后,还会断开连接用来节约系统资源。在数据传递时,有确认机制、重传机制、拥塞控制机制以保证传输的可靠性,但这些机制都会消耗大量的时间和系统资源,每个连接都会占用系统的 CPU、内存等硬件资源,所以也导致 TCP 容易被人利用,比如 DDOS、CC 等攻击。
一般用于文件传输、收发邮件或远程登录等对数据准确性要求高的场景。
UDP:
UDP 没有 TCP 那些可靠的机制,所以在数据传递时,如果网络质量不好,就会很容易丢包。但 UDP 也是无法避免攻击的,比如:UDP Flood 攻击。
一般用于即时通讯、在线视频、网络电话等对传输效率要求高,但对准确性要求相对低的场景。
四. TCP 的三次握手和四次挥手
TCP三次握手
所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。
TCP 四次挥手
TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
扩展:
TIME_WAIT状态所带来的影响:
当某个连接的一端处于TIME_WAIT状态时,该连接将不能再被使用。事实上,对于我们比较有现实意义的是,这个端口将不能再被使用。某个端口处于TIME_WAIT状态(其实应该是这个连接)时,这意味着这个TCP连接并没有断开(完全断开),那么,如果你bind这个端口,就会失败。对于服务器而言,如果服务器突然crash掉了,那么它将无法再2MSL内重新启动,因为bind会失败。解决这个问题的一个方法就是设置socket的SO_REUSEADDR选项。这个选项意味着你可以重用一个地址。