以前很多不同的厂家生产各自的计算机,有着不同的操作系统,只有同样的操作系统的计算机才能通信,但TCP/IP允许这些不同的操作系统的计算机互相进行通信,他们都准守则一些协议在网络中进行传输,这些守则被称之为TCP/IP协议。
网络分层
由于TCP/IP协议比较复杂,所以我们一般把TCP/IP协议通过分层来进行讨论,每一层负责不同的通信功能,每一层的开发都是独立的,无需关心另外一层,TCP/IP通常分为四层,OSI把网络通常分为7层,本质上是一样的,只是OSI七层模型分的更细而已。
TCP/IP四层
应用层:负责特定的应用程序细节,如FTP, HTTP, TELNET 等 |
运输层:为应用程序提供端到端的通信,TCP, UDP传输 |
网络层:IP选路,IP包,ICMP, IGMP及路由器相关 |
链路层:设备驱动程序和网卡及以太网,交换机相关 |
一般来说顶层应用层关心的是程序的细节,如FTP的login/dir/mget/等,不会关心下三层这个数据如何在网络中传输,用TCP还是UDP,如何在路由器中选路,如何获取接收端的MAC地址从而正确无误的传达到目的端,这些在应用层是不关心的,同理下三层主要关心的是数据在网络中的传输过程,如何可靠,如何快速到达等细节,而对应用程序却一无所知,下三层不关心你是HTTP还是FTP,它都把这些当做是数据封装在数据里,下三层考虑的是如何增加数据头,以使得他们在网络中进行正确的传输。互联网的目的之一就是在应用程序中隐藏掉所有的物理细节,应用层不会关心也不能关心是在以太网中传输还是在令牌环上传输,这样应用开发人员只要开发好的应用,而网络工程师则设计最好的,最快的,最适合的网络
应用层:应用程序细节 |
表示层:数据的表示,如jpeg, ascII, 加密格式 |
会话层:建立,管理,终止会话 |
传输层:定义端口,及流控,TCP/UDP |
网络层: IP选路,逻辑寻址 |
链路层:硬件地址选址,差错检验 |
物理层:物理电缆,光纤等传输媒介 |
数据封装
之前说过,数据在网络中传输需要经过数据链路层,网络层,传输层,这其实是一个封装的过程,一个应用程序加上应用程序头,如我们浏览一个html网页,看到了新浪首页,里面有图片,有文字,我们统称为数据,在这些数据前面加上Http头,如版本信息等,应用层数据被分成TCP分段,各分段被打上标签,在传输层传输,传输层把http_head+data看作一个整体,统一加上tcp_head,TCP分段发送到网络层,网络层把tcp_head+http_head+data看作一个整体,统一加上ip_head封装成IP数据报文,之后发送到接入层,把ip_head+tcp_head+http_head+data看作一个整体,统一加上ethernet_head成为以太网帧,最后通过网线或光纤到达接收主机,这个封装过程我们一般把应用程序称之为数据,为了能够更好的传输,我们通常会把大数据进行分片,提高传输的可靠性,即使有一些片断丢失了,只需要重传这一部分就好,而无需全部重传,这个分段发生在传输层,称之为segment, TCP分段后在IP层进行传输,我们称之为IP数据报,最后增加以太网首部后,整个数据我们称之为以太网帧,如下图
解封装
接收主机以相反的方式进行解封装,接收端收到的是ethernet_head+ip_head+tcp_head+http_head+data,把头部一层一层的剥去,最终留下data给浏览器展现在客户面前的是新浪的首页
C/S模型
网络中最经典的模型就是客户端服务器模式,目的是使服务器为客户端提供一些特定的服务,纸上得来终觉浅,觉知此事需躬行,最后以一个经典的http案例来解释网络传输的过程,由于只是综述,并不打算展开细讲,所以直接取局域网内的两台PC作实验,免去IP路由这一块。
Web Server:
IP: 192.168.2.111:8000
MAC: b4:6d:83:92:63:69
Web Client:
IP: 192.168.2.101
MAC: 00:26:c6:c9:ad:74(IntelCor_c9:ad:74)
Step1 找人:
Web Client想与 Web Server进行通信,首先他得找到Web Server,这是一个通过IP地址寻找MAC地址的过程,client知道网址http://192.168.2.111:8000/blog,但它并不知道是哪台服务器,此时它首先产生一个ARP的过程,通过IP寻找MAC的过程
Client首先广播一个数据帧询问本网谁的IP地址是192.168.2.111
Server接到该广播后发现找的是自己,于是单播回给client,你要找的是我,并把自己的MAC地址告诉client,这样client就可以与server进行通信了,ARP工作在二层,所以目前只有一个以太网头,没有IP头
Step2 建立连系
Client与Server通过三次握手建立连接,协商TCP分段大小,确认对端可靠,TCP的三次连接指的是client发一个sync给Server并带上自己的client_seq值
Server收到sync后,回一个ack, ack=client_seq+1,并发送sync给client附上server_seq值,以期望得到client的确认
Clinet收到Server的sync后,回一个ack=server_seq+1进行确认
TCP三次连接此时数据封装在tcp层, Ethernet_head+ip_head+tcp_head+data(tcp_segment)
Step3 获取页面
Client发出一个get信息想获取blog主页,这个信息的tcp_len=363
Server接收到Client的消息后进行ack确认,ack=client_seq+tcp_len=1+363=364
Server回一个http 200表示http过程OK
Server开始传送主页的数据,由于主页html数据太大,需要进行分段传输,Server首先发了一个分段数据,Client确认后,Server继续发送,直到数据发完后,进行结束确认
前面介绍的是数据包,可以看到的都是封装后的包,而如何封装,如何解封装在抓包中是看不到的,但在逻辑层面是存在分层,是通过主机或者设备的协议栈中进行封装的,封装的过程说白了就是对数据加头部和尾部的过程,整个头部和数据,尾部一起统称为协议数据单元(PDU)发送的过程就是沿着OSI参考模型向下流动,不断的加数据头,PDU逐渐变长,各层协议均将其头部信息添加进去,直到物理层进行传输,发送给目标主机,而接收端通过协议栈不断的剥去协议头部,最终只剩下原始的数据,这就是解封装的过程
Client在计算机上浏览http://192.168.2.111:8000/blog
Client需要从服务器上下载一个index.html的文件
Client把请求的数据沿着协议栈传给传输层,由于HTTP是基于TCP的,因此在传输层将创建TCP头部来封装HTTP数据
TCP是架构在IP之上的,为了能够在网络中传输,协议栈又把TCP看作一个整体,创建IP头部进行封装,以明确目的IP,进行逻辑寻址,发送数据到以太网上
以太网给IP数据创建以太网头部,明确发送的接收主机是谁
当数据已经完全封装好后,传递给物理层,此时数据包变成0,1信号通过网络进行传输
封装好的数据通过网线到达服务器,服务器开始读取数据,从下往上,先读以太网数据帧,确认以太网头部发的是不是自己,处理好后,剥去,再读取IP头部,确认数据包正确转发,处理好后剥去,再确认TCP头部,确保数据按序到达,随后剥去,留下原始HTTP数据,分析应用层中的内容,返回HTTP 200表明OK,发送端等待服务器发送index.html页面数据
总结:
这篇文章主要讲的是网络分层,数据封装,这些都是在实际抓包过程中看不到,但是却是我们分析数据的基础,最后以一个经典的C/S,client取server页面的实验来讨论封装,来讨论取数据的过程,但如IP,TCP的头部细节等并不在本文讨论范围
参考:
TCP/IP协议卷一
https://community.emc.com/go/chinese
来源:oschina
链接:https://my.oschina.net/u/2303535/blog/667228