网络通信与IO:网络模型与协议

Posted 加班攒钱种头发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络通信与IO:网络模型与协议相关的知识,希望对你有一定的参考价值。




OSI网络七层模型简介

网络通信与IO(2):网络模型与协议
 


网络七层模型就是一个参考模型,也就是说有这么个七层的定义,就像是项目中的dao、server、controller三层架构一样,每一层都有自己的工作要干,互联网协议就按照不同的作用分为osi七层或tcp/ip五层或tcp/ip四层。


应用层

第一层:应用层。定义了用于在网络中进行通信和传输数据的接口

第二层:表示层。定义不同的系统中数据的传输格式,编码和解码规范等

第三层:会话层。管理用户的会话,控制用户间逻辑连接的建立和中断


传输层

第四层:传输层。管理着网络中的端到端的数据传输


网络层

第五层:网络层。定义网络设备间如何传输数据


链路层(网络接口层)

第六层:链路层。将上面的网络层的数据包封装成数据帧,便于物理层传输

第七层:物理层。这一层主要就是传输这些二进制数


学习计算机网络时我们一般采用折中的办法,也就是中和OSI和TCP/IP的优点,采用一种只有五层协议的体系结构学习即可,这样既简洁又能将概念阐述清楚。

网络通信与IO(2):网络模型与协议


网络通讯的流程了基本如下(五层):

应用层,数据(加http协议等)-》传输层(包上tcp或者udp协议)-》网络层(包上ip协议)-》数据链路层(包上以太网协议)-》物理层


下面就开始详细介绍这个几层,并按如上流程进行演示,最好开一台服务器或者虚拟机,跟着一起操作感受一下




应用层

网络通信与IO(2):网络模型与协议
 

比如浏览器、qq微信都是属于应用层,准确的说是应用层客户端,访问的服务器就是应用层服务端。我们在浏览器发送的请求会被加上http协议传输到传输层。还有xftp、sqlyong等等会加ssh协议。


这些协议就是所谓的应用层协议,用来约定两个程序传输的格式、怎么加密的等等。不同的场景选择不同的协议来工作。


其后的传输层、网络层、网络接口层我们并不需要关心,因为这是操作系统内核帮我们做好的事情了。就像我们使用浏览器一样,http协议浏览器帮我们加好了,只需要输入域名就可以。


用linux访问百度举个例子:


1.创建连接:8就代表文件描述符,<>代表输入输出,然后指向了一个路径,但是操作系统内核会把这个路径转换成对百度的socket连接

exec 8<> /dev/tcp/www.baidu.com/80


创建socket之后,cd到/proc目录下

网络通信与IO(2):网络模型与协议

这个目录下是内核程序运行时我们能在文件系统看到的东西,可以看到目录中有很多数字的目录,可以把他们想象成线程号一样。


如下命令就是查看当前执行进程的进程号,相当于查看当前运行的线程了。

echo $$

网络通信与IO(2):网络模型与协议


可以看到当前的进程号就是5725,那么进入5725

网络通信与IO(2):网络模型与协议

可以看到一些目录,这个fd就是前面说的文件操作符了,再cd进去,ll查看

网络通信与IO(2):网络模型与协议

0代表标准输入,1代表标准输出,2代表报错,下面的8就是我们刚才创建的socket,指向的百度。


那么我们现在其实就是应用层客户端,我们已经有了应用服务端百度的连接,那么我现在应该遵循某种协议,给百度发一些信息,让百度把主页返回给我们。现在很明显我们应该遵循HTTP协议。


2.发送请求:请求的HTTP协议规范为 “GET / HTTP/1.0 ”,最后 就是换行符,-e代表识别换行符,>代表会写到文件中,>&就代表会写到文件描述符中。

echo -e "GET / HTTP/1.0
" >& 8

通过执行上面命令,就会把“GET / HTTP/1.0 ”通过8号文件描述符发送给百度,我们8号文件描述符的这个socket连接是双向的,可输入输出,那么百度就会把主页的信息放到socket中,我们只需要把8文件描述符的数据输入重定向出来,就可以看到百度主页的信息了

cat <& 8

网络通信与IO(2):网络模型与协议

网络通信与IO(2):网络模型与协议


上面我们干的其实就是一个应用层做的事,传输层网络层我们是无感的,因为系统内核已经把TCP协议的事做了,后面我们继续深入研究系统内核怎么做的TCP协议。


我们想一下刚才就做了两步,通过exec建立连接,发请求。那么怎么从应用层到的传输层、网络层的呢,其实太明显了,传输就是socket做的嘛,所以exec创建socket时就是调用了内核的传输层才建立的socket。




传输层

网络通信与IO(2):网络模型与协议
 


传输层就是把一台计算机的数据传输到另一台,基于的协议可以是TCP或者UDP,TCP是面向连接并可靠的协议,那么什么叫面向连接还可靠的呢,他要通过三次握手,四次挥手来保证它的可靠性。


三次握手

什么是三次握手呢,其实就像下图一样,由客户端这边的传输层创建了一个sync数据包发给服务端,代表我想和你建立握手,服务端如果能收到这个包,一般服务端的传输层会给客户端回一个sync+ack确定包,最后客户端还得再给客户端回一个确认包,这样就通过三次握手建立了连接。

网络通信与IO(2):网络模型与协议

网络通信与IO(2):网络模型与协议

再来解释一下为什么需要三次握手,我们建立的socket这种网络通信是双向的,也就是客户端也发送有接收,服务端也有接受和发送,我们就需要让客户端和服务端都必须确定自己的接收和发送的是通的,那么最少需要三次,才能确定一个可用的socket。


一旦双方通过三次握手确认了自己的输入输出没有问题,这时候怎么建立连接呢,连接并不是一个实质性的连接,而是双方专门开辟出一块资源,这个资源有可能是一个进程,也可能是java当中一个线程,它是专门为对方而准备,然后就可以完成后面后续的通信过程,这就是所谓的面向连接。


如下这段代码其实就是开启一个socket,然后如果有客户端连接进来,等三次握手成功了,就能通过socket对象的accept方法拿到连接,然后开启个线程处理它,进而完成后续的数据读取与写入。

网络通信与IO(2):网络模型与协议


这时候我们再想一下应用层干的事,把应用层和传输层结合起来,其实就是应用层把那个http协议传给了传输层,传输层又把它封装成数据包,然后三次握手建立连接,最后发送出去。


四次挥手(四次分手)

当双方完成交互,要做的事情干完了,就要断开连接,断开连接其实就是释放开辟的资源。那我们断开是想断开就能断开嘛,并不能,因为我们的资源是为对方服务的,所以需要对方知道并且同意了我们才能断开。

网络通信与IO(2):网络模型与协议

如上图,假如是客户端想断开,那么客户端的传输层会创建一个Fin数据包,服务端收到后,会回送一个ACK包,回的意思是我知道你想断开了,但是并没有同意断开呢,服务端还需要再发送一个Fin数据包,代表我同意断开了,客户端再回一个我收到了。俩次的断开都是各自发出的,以保证双方安全的释放掉资源。


如果超时了或者其他原因导致没有完成四次分手,那么时间过了,太久没响应,自己也会把资源释放掉了。


思考

这时候其实对网络通讯已经比较了解了,那么我们再来想一个问题,比如我们浏览器打开十个标签页,搜索不同的东西,为什么搜索的结果没有传乱了呢,可以想到他们每个标签都是不同的连接,不同的socket,那么大家对socket的认知恐怕只知道他是一个套接字。


其实可以把他理解为“Ip-port ip-port”,两台计算机的ip和端口组成唯一映射关系。这个在Linux系统当中也可以体现出来


netstat -natp

网络通信与IO(2):网络模型与协议


前面的是本机的ip和prot,后面的是对端的ip和prot,这一对就可以理解为套接字socket,我们还可以注意一下第一列,端口号的22,并且还是sshd协议,LISTEN状态,就代表这个程序是一个Server服务端,开始监听我的22端口有没有人连接。


下面我们干一个有趣的事。

网络通信与IO(2):网络模型与协议

我们开启三个标签,创建了三个连接,是不是和刚才说到的浏览器标签是一样的感觉,那我们找到这三行进行对比

网络通信与IO(2):网络模型与协议

网络通信与IO(2):网络模型与协议

网络通信与IO(2):网络模型与协议


但是端口是数量有限的(0-65535),所以事情做完会断开连接释放资源,释放端口号。


补充:一台服务器可以启动两个tomcat,但是服务端的两个tomcat不能同时使用8080,其实这也符合前面说的一切皆文件,两个tomcat就是两个进程,我们的请求到主机了,主机就可以根据不同的端口号的映射找到目标进程

网络通信与IO(2):网络模型与协议




网络层

网络通信与IO(2):网络模型与协议
 


传输层会帮我们做三次握手,创建数据包,但是是在网络层发出去的。也就是在创建握手包之后他是调向网络层的,网络层对应的就是IP协议了。


这里要说到一点就是经常会把TCP/IP说到一起,这个TCP/IP其实指的就是OSI模型,OSI的应用层对应HTTP、SSH等,传输层对用TCP,网络层对应IP,所以叫做TCP/IP,说的就是OSI模型了。


IP是互联网所有设备唯一标识的ID,网络层就是通过IP寻找到对方的路由路径,这时候我们考虑全球那么多IP,应该怎么去找到目标IP,在互联网里也是层级关系的,也就是先有小网也就是我们局域网,后有大网就是我们的互联网。从互联网中找到局域网,在从局域网中找到目标IP。所以我们IP中相当于有两个信息,一个是自己的名字,一个是归属于哪个局域网。


首先查一下我们ip信息

ifconfig

网络通信与IO(2):网络模型与协议


打开网卡配置文件,if是interface,cfg是config,eth就是以太网,0就是第一块网卡

vi /etc/sysconfig/network-scripts/ifcfg-eth0

网络通信与IO(2):网络模型与协议



这块需要了解二进制和十进制,不懂的百度一下吧,很简单。


我们先说IP和掩码的关系,IPV4是点分字节,也就是一个点两侧分别是一个字节Byte,一个字节有8个二进制位。


所以我们常说IPV4是32位的就是4*8(IPV6是128位),一个字节有8个二进制位那么最大就是11111111,最小00000000,二进制转十进制,11111111转为十进制就是255,也就是0-255。


IP清楚以后看掩码,掩码是三个255一个0,掩码和IP之间有个运算关系,叫做二进制的按位与运算,按位与运算就是全1为1,有0则0。


即(0&0=0; 0&1=0; 1&0=0; 1&1=1)


那么每一位做比较,192的二进制是11000000,255的二进制是11111111,所以得到的还是11000000,14的二进制和0的二进制做与运算得到的是0


也就是拿IP和掩码做完运算得到的是192.168.150.0,算出的192.168.150.0就是这台计算机所在的局域网,如果其他计算机能找到192.168.150这个局域网就能找到14号机。


然后我们先抛开GATEWAY网关,继续说IP,IP协议这层对应着一个路由表,我们可以想一下现在这个世界当中,手机,笔记本,台式机都是可以联网的,他们之间可以互相通讯,那么怎么手机怎么连接到服务器呢,互联网怎么互联的呢?


这里补充个知识点,比如我们ping了以下百度,他能在三四毫秒就能找到百度,我们读硬盘来读文件,磁头寻址读到目标文件的时间也是毫秒级别,我们再回想之前说的冯诺依曼体系,我们的硬盘、网卡都是输入输出设备,那么我们可以得出一个结论:在计算机系统当中IO是个瓶颈,他的延迟是毫秒级,因为内存的寻址时间是纳秒级别,内存比一切IO快了十万倍,所以说IO就是计算机系统中的瓶颈,从时间就是可以算出来。

网络通信与IO(2):网络模型与协议


网络通信与IO(2):网络模型与协议



下一跳是个什么机制什么概念呢,就和上图是一样的,比如上图三台计算机,a连b,b连c,a想访问c,它会直接把数据包扔给b,但是a并不知道能不能找的到,但它只有b这么一个出口,所以a会直接把数据包丢给直连的b,b再丢给c,这样都只扔给和自己直连的机器,就这样一跳一跳的就能有可能跳到目标计算机,当然也有可能跳丢了,这也就是学术界质疑的点。


为什么会采用这种下一跳的机制呢,因为我们面向每台主机,它不需要知道全局,只需要知道一个出口就可以了,所以前面提到的路由表就是要去完成这个下一跳机制。


我们来人肉模拟一下数据包出入选址的过程:

Linux系统中输入查看路由表命令

route -n

网络通信与IO(2):网络模型与协议


网络通信与IO(2):网络模型与协议




猜猜这个网关是谁,太明显了,他就是路由器嘛,我们的路由器就是我们的网关,我们把数据包扔给路由器,路由器也有自己的路由表,它扔给运营商,运营商再扔给城域网,城域网再扔给骨干网,最终扔到我们要访问的服务器上去,这就是下一跳的过程


那么我们访问同一局域网怎么访问的,比如我们ping自己局域网内的一台机器

网络通信与IO(2):网络模型与协议

拿ip和掩码做完运算就走路由表的第一条了吧,并且没有网关





链路层

网络通信与IO(2):网络模型与协议
 


arp -a

网络通信与IO(2):网络模型与协议



这就是由网络层和链路层组成的完整的TCP/IP下一跳机制。


ARP协议补充:

网络通信与IO(2):网络模型与协议


网络通信与IO(2):网络模型与协议





到这里网通通讯的过程已经结束了,鄙人初学的时候觉得很难理解,经过了三四天的思想转变才想明白。下面通过抓包测试,来验证以下前面的通讯逻辑是否正确。




抓包测试、验证

网络通信与IO(2):网络模型与协议
 


首先安装一个抓包工具

yum install tcpdump
tcpdump -nn -i eth0 arp or port 80
arp -d 192.168.150.2 && curl www.baidu.com 80

然后看我们的数据包都发生了什么事情

网络通信与IO(2):网络模型与协议

这时候链路层arp初始化好了以后,链路层就可以和网络层一起配合着发送数据包了。


网络通信与IO(2):网络模型与协议

三次握手完毕以后,双方为对方开辟了资源。后续操作都携带.,也就是ack确认


  • 在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。


  • 在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。


  • 未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端误以为数据没有到达目的地而重发数据。


传输数据过程如下

网络通信与IO(2):网络模型与协议

这个步骤就是数据传输的过程,本地给服务器请求,服务器响应确认,服务器分批返回数据,本地收到数据响应确认,P就代表着,我的请求发完了,尽快执行,不要有缓存积压。


这里其实还有一个窗口的概念,目的是为了提高传输的效率和可靠性,下面再详细说下这个窗口的概念以及刚才上面说的确认、重发机制


利用窗口控制提高速度

TCP 以1个段为单位,每发送一个段进行一次确认应答的处理。这样的传输方式有一个缺点,就是包的往返时间越长通信性能就越低。


为解决这个问题,TCP 引入了窗口这个概念。确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅地缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。如下图所示:

网络通信与IO(2):网络模型与协议


窗口大小就是指无需等待确认应答而可以继续发送数据的***值。上图中窗口大小为4个段。这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。


滑动窗口控制

网络通信与IO(2):网络模型与协议

  • 上图中的窗口内的数据即便没有收到确认应答也可以被发送出去。不过,在整个窗口的确认应答没有到达之前,如果其中部分数据出现丢包,那么发送端仍然要负责重传。为此,发送端主机需要设置缓存保留这些待被重传的数据,直到收到他们的确认应答。


  • 在滑动窗口以外的部分包括未发送的数据以及已经确认对端已收到的数据。当数据发出后若如期收到确认应答就可以不用再进行重发,此时数据就可以从缓存区清除。


  • 收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。这样可以顺序地将多个段同时发送提高通信性能。这种机制也别称为滑动窗口控制。


窗口控制中的重发控制

在使用窗口控制中, 出现丢包一般分为两种情况:

① 确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重发的,如下图:

网络通信与IO(2):网络模型与协议

② 某个报文段丢失的情况。接收主机如果收到一个自己应该接收的序列号以外的数据时,会针对当前为止收到数据返回确认应答。如下图所示,当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,因此,在窗口比较大,又出现报文段丢失的情况下,同一个序列号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答,就会将其对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称为高速重发控制。

网络通信与IO(2):网络模型与协议


网络通信与IO(2):网络模型与协议

最终客户端把主页数据接受完,四次分手断开连接,网络通讯完成。




模型总结

网络通信与IO(2):网络模型与协议
 


OSI七层模型

TCP/IP概念层模型

功能

TCP/IP协议簇

应用层

应用层

文件传输,电子邮件,文件服务,虚拟终端

HTTP,SSH,FTP,DNS

表示层

数据格式化,代码转换,数据加密

会话层

解除或建立与别的接点的联系

传输层

传输层

提供端对端的接口

TCP,UDP

网络层

网络层

为数据包选择路由

IP,ICMP,RIP

数据链路层

链路层

SLIP,CSLIP,APP

物理层

以二进制数据形式在物理设备上传输数据

IS02110



网络通信与IO(2):网络模型与协议

应用层


应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等等。我们把应用层交互的数据单元称为报文



网络通信与IO(2):网络模型与协议

传输层


运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。


传输层协议

传输控制协议TCP(Transmisson Control Protocol)--提供面向连接的,可靠的数据传输服务。


用户数据协议UDP(User Datagram Protocol)--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)




网络通信与IO(2):网络模型与协议

网络层


网络层(network layer)负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,由于网络层使用IP协议,因此分组也叫IP数据报,简称数据报。


网络层的另一个任务就是选择合适的路由,使源主机运输层所传下来的分株,能通过网络层中的路由器找到目的主机



网络通信与IO(2):网络模型与协议

数据链路层





协议总结

网络通信与IO(2):网络模型与协议
 



网络通信与IO(2):网络模型与协议

TCP/IP(传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP,以及http等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。所以完全可以把TCP/IP理解为它就是OSI网络模型


网络通信与IO(2):网络模型与协议

TCP是传输层协议,主要解决数据如何在网络中传输,它是以二进制数据流的形式解决传输层的事,它能将信息分割成组,并在接收端将其重组,并且提供拥塞控制和流量控制机制,丢包时的重发控制,但是对于上层应用的开发极不友好,所以面向应用层的开发又产生了HTTP协议,TCP是面向连接的,通过三次握手保证通信可靠性


网络通信与IO(2):网络模型与协议

UDP也是传输层协议,但不是面向连接的,不具有可靠性的数据报协议,也就说UDP不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务,UDP 无法进行流量控制等避免网络拥塞行为因此网络出现拥塞不会使源主机的发送速率降低。


甚至当包的到达顺序出现乱序时也没有纠正的功能。UDP支持一对一、一对多、多对一和多对多的交互通信,UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。也就是包总量较少的通信(DNS、SNMP等),视频、音频等多媒体通信(即时通信)


网络通信与IO(2):网络模型与协议

HTTP协议是一个基于请求和应答模式,存在于传输层之上的应用层协议,通常是基于TCP的连接方式,它本身是一个无状态,无连接的协议,每次连接只处理一个请求.服务器处理完客户端的请求,然后响应,并收到应答之后,就断开连接.这种方式可以节省传输时间


网络通信与IO(2):网络模型与协议

请求和应答模式

HTTP协议定义了web客户端如何从web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.HTTP协议采用了请求/响应模型.客户端向服务器发送一个请求报文,请求报文包括请求的方法,url,协议版本,请求头部和请求数据.服务器以一个状态行作为响应,响应的内容包括协议的版本,成功或者错误代码,服务器信息,响应头部和响应数据


网络通信与IO(2):网络模型与协议

无状态

无状态是指协议对于事务处理没有记忆能力,这种方式的一个坏处就是,如果后续的处理需要用到之前的信息,则必须要重传,这样就导致了每次连接传输的数据量增大.好处就是,如果后续的连接不需要之前提供的信息,响应就会比较快.而为了解决HTTP的无状态特性,出现了Cookie和Session技术.


网络通信与IO(2):网络模型与协议

HTTP和tcp的区别

很多人会把http和tcp看作两种不同但是是同级的协议,注意不是这样的,http是要基于TCP连接基础上的,简单的说,TCP就是单纯建立连接,不涉及任何我们需要请求的实际数据,简单的传输。http是用来收发数据,即实际应用上来的。TCP是底层通讯协议,定义的是数据传输和连接方式的规范 HTTP是应用层协议,定义的是传输数据的内容的规范 HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP


网络通信与IO(2):网络模型与协议

socket:socket并不是一种协议,他是对复杂的tcp进行了封装。是针对TCP或UDP的具体接口实现,提供了在传输层进行网络编程的方法




结尾


 

以上是关于网络通信与IO:网络模型与协议的主要内容,如果未能解决你的问题,请参考以下文章

通过实例理解Java网络IO模型

网络分层协议与模型

java网络编程

java网络编程

Java网络编程和NIO详解3:IO模型与Java网络编程模型

计算机网络参考模型与5G协议