网络存在的意义就是跨地域数据传输, 称之为通信
网络 = 物理链接介质 + 互联网通信协议
互联网的本质就是一系列的协议,总称为‘互联网协议’(Internet Protocol Suite)。互联网协议的功能:定义计算机如何接入internet,以及接入internet的计算机通信的标准。
OSI七层模型
互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
OSI七层协议数据传输的封包与解包过程如下
将应用层,表示层,会话层并作应用层,从tcp/ip五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议, 就理解了网络通信的原理
物理层
物理层的作用:
(1) 规定怎样在连接各种计算机的传输媒介上传输数据比特,不是指具体的传输媒介。
(2)完成传输方式的转换。因为在计算机内部多采用并行传输方式,但数据在通信线路上一般都是串行传输。
负责发送电信号, 单纯的电信号毫无意义, 必须对其进行分组, 一组物理层数据称之为位。
数据链路层: ethernet以太网协议
数据链路层由来:单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思
数据链路层的功能:定义了电信号的分组方式
数据链路:链路是一个结点到另一个结点之间的物理线路,而中间灭有其他交换结点。当传输数据时,还需要一些必要的通信协议来控制数据传输。因此,链路加上通信协议就是数据链路。
在数据链路层中, 一组数据称之为数据帧
帧:数据链路层的协议数据单元为帧。数据链路层将网络层下发的IP数据报封装成帧
数据帧分为两部分: 头部信息和数据, 头部信息中包含有源地址与目标地址, 该地址是mac地址, 数据即网络层的整体数据内容。
以太网协议规定但凡接入互联网的主机必须有一块网卡, 每块网卡在出厂时都烧制好一个独一无二的地址-mac地址
注意: 计算机通信采用的是广播的方式, 即以太网协议的工作方式是广播
因为以太网协议的工作方式是广播的方式, 所以, 如果一台计算机发送信息时, 全世界将会收到, 所以这将导致出现问题, 那么就需要划分网络区域, 也就是网络层的工作
网络层: IP协议, ARP协议
网络层要达到的目的: 划分广播域, 每一个广播域但凡要接通外部, 一定要有一个网关帮内部的计算机转发包到公网, 网关与外界通信走的是路由协议
在网络层中, 一组数据称为数据包, 数据包分为头信息和数据两部分, 头信息中包括源地址和目标地址(该地址是ip地址), 数据包含传输层整体的数据内容。
注意: 一个合法的IPv4地址组成部分 = ip地址/子网掩码地址
IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGMP的数据都以IP数据格式传输。要注意的是,IP提供不可靠、无连接的数据传送,赖其他层的协议进行差错控制。不可靠指的是IP数据报不保证能成功的到达目的地,如果出现错误则选择丢弃该数据,然后发送ICMP消息报给信源端。无连接指的是IP不提供任何后续数据报的状态信息,每个数据报处理都是独立的。如果一个信源发送了连续的两个数据报,每个数据报选择独立的路由,两个数据可能不同时到达。
IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。
进行网络通信的时候, 我们事先知道的是对方的ip地址, 但是计算机的底层通信是基于ethernet以太网协议的mac地址通信, 所以必须要将ip地址解析成mac地址, 这就要使用到ARP协议。
ARP协议的工作流程 # 两台计算机位于同一局域网内 1. 会先获取两个通信的计算机的ip地址, 然后计算两者的地址, 如果一样, 拿到另一个计算机的mac地址即可
2. 然后发送广播包, 格式如下: 源mac 目标mac 源ip 目标ip 数据部分 发送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 数据
FF:FF:FF:FF:FF:FF有特殊的含义, 表示要获取目标mac地址 # 两台计算机不在同一局域网内 1. 会先获取两个通信的计算机的ip地址, 然后计算两者的地址, 如果不一样, 拿到网关的mac地址
2. 然后发送广播包, 格式如下: 源mac 目标mac 源ip 目标ip 数据部分 发送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 数据 FF:FF:FF:FF:FF:FF有特殊的含义, 表示要获取目标mac地址
3. 然后网关将数据通过路由协议找到目标计算机, 然后得到目标的mac的地址
这个包会以广播的方式在发送端所处的自网内传输,所有主机接收后拆开包,发现目标ip为自己的,就响应,返回自己的mac
ip地址+mac地址可以标识全世界范围内独一无二的计算机, 当然, 由于ARP协议的存在, ip地址也可以标识全世界范围内独一无二的计算机
传输层: tcp/udp协议, 都是基于端口的协议
传输层功能:建立端口到端口的通信
端口范围0-65535, 0-1023为系统占用端口
TCP将用户数据打包构成报文段,它发送数据时启动一个定时器,另一端收到数据进行确认,对失序的数据重新排序,丢弃重复的数据。TCP提供一种面向连接的可靠的字节流服务,面向连接意味着两个使用TCP的应用(B/S)在彼此交换数据之前,必须先建立一个TCP连接
TCP三次握手建立连接的过程:
1、请求端(客户端)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序列号(ISN),这个SYN为报文段1.
2、服务器发回包含服务器的初始序列号的SYN报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个字符。
3、客户必须将明确序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)
4、这三个报文段完成连接的建立,这个过程成为三次握手。
TCP四次挥手终止连接的过程:
1、客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2、服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
3、服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
4、服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
TCP总共有11种状态:
- LISTEN :等待连接。
- SYN_SENT : 客户端主动发起连接请求(发送 SYN n)。
- SYN_RECV : 服务端接到连接请求后,响应 (发送 ACK n+1,SYN j)。
- ESTABLISHED :连接建立成功(发送 ACK j+1)。
- FIN_WAIT1 : 客户端主动关闭连接,等待对方确认是否可以关闭(发送 FIN x)。
- FIN_WAIT2 : 客户端收到对方确定可以关闭回应(接收到ACK x+1)。
- CLOSE_WAIT : 服务端准备关闭连接时的状态,此时连接还为关闭。
- LAST_ACK : 服务端发送可以关闭的消息(发送FIN y)。
- CLOSING :客户端接到服务器关闭连接的信息,发送连接正式关闭消息(接收到 FIN y,发送ACK y+1)。
- TIME_WAIT : 客户端进入time wait 时间,等2倍MSL 时间后,关闭连接。
- CLOSED :服务端接到客户端正式关闭消息后,关闭连接。(接收到 ACK y+1)
注意: 当服务器大量处于TIME_WAIT状态时, 意味着服务端正在经历高并发
应用层: 规定应用程序的数据格式
TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。
应用层协议定义了运行在不同端上的应用程序进程如何相互传递报文,其中包括了
1)交换的报文类型,
2)各种报文类型的语法,如报文中的各个字段以及这些字段是怎么描述的
3)字段的语义,即这些字段中包含信息的含义
4)一个进程何时以及如何发送报文,对报文进行响应的规则
Socket抽象层
我们知道两个进程如果需要进行通讯最基本的一个前提是能够唯一标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的IP地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用IP地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用Socket进行通信了,什么是Socket呢?我们经常把Socket翻译为套接字,Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。