◆ ◆ ◆
这期《黑客养成计划》的协议基础系列会持续发布
希望能够对准入门的盆友们起到一定帮助
本期对TCP/IP协议原理是进行简述而不是进行剖析,毕竟时间有限,深度剖析的话需要很大篇幅的进行描述,这里不是笔者懒,而是我觉得对于准入门的盆友来说,了解这些知识点足矣。往后当自己能力提升到一定程度后再回头深入了解同样不迟。因为当初笔者入门的时候就是花费太多时间去深入分析,这导致我花费的学习时间成本太大,而且收效很低,因为没有得到应用,后来也逐渐忘记,我觉得这是一条弯路,所以我不希望大家再走这条弯路。
0x01 TCP/IP协议栈简述
TCP/IP协议栈从字面上理解,这里包含着TCP和IP协议,在实际应用中,有的场景也确实指的就是这两种协议。但是很多情况下,它是通信过程所必须用到的协议群的统称,具体用到的协议群有IP/ICMP/TCP/UDP/TELNET/FTP/HTTP等等,而不是就是泛指TCP和IP两种协议,要仔细看清楚。所以总的来说,TCP/IP协议栈就是一系列网络协议的总称,它是构成网络通信的核心骨架。
TCP/IP协议采用4层结构,其分别是
应用层
、
传输层
、
网络层
、
链路层
。
上面这幅图就是TCP/IP协议栈的基本框架,其
原理
就是当通过HTTP发起一个请求的时候,应用层、传输层、网络层和链路层的相关协议依次对该请求进行包装并携带对应的头部,最终在链路层生成以太网数据包,以太网数据包通过物理介质传输给对方主机,对方接收到数据包以后,再一层一层采用对应的协议进行拆包,最后把应用层数据交给应用程序处理。
上面说的复杂,还没明白的我打个比喻,网络通信过程就是快递发送接收的过程。这份快递需要包装,用什么包装呢,用各种协议包装。每一种协议上面包含了该快件的信息、收货地址、收件人、联系电话等,然后还需要配送车、配送站点、配送员等等,一般情况下,快递不可能直达的,所以需要转发到对应的配送站,配送站揽件后继续派件。这一过程中,配送车就是物理介质,配送站充当了网关的角色,快递员就是路由器,负责派送,收货地址就是所谓的IP地址,联系方式就是所谓的MAC地址,最后快递成功送到收件人手中。这就是通俗易懂的概念。
网络层:
负责定义IP地址格式,从而能够使得不同应用类型的数据在Internet上顺利传输。
应用层:
负责针对特定应用的协议,就用户而言,其就是一个图形化操作界面。
将每层的职责串联起来,那么此模型的工作流程可以通俗易懂的进行概括起来,如下:
当你输入一个网址并按下回车键的时候,首先,应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;然后网络协议加上了双方的IP地址,确认了双方的网络位置;最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机。而对于不同网段,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机。目标机接收到数据包后,采用对应的协议,对帧数据进行组装,然后再通过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、 基于IP的传输层协议。TCP在IP报文的协议号是6。关于TCP协议头部的格式,前辈们总结的很完善了,传送链接:
TCP协议的作用就是保证数据通信的完整性和可靠性,防止丢包。
IP协议是TCP/IP协议栈的核心,所有的TCP,UDP,ICMP,IGMP的数据都以IP数据格式传输。要注意的是,IP不是可靠的协议,就是说,IP协议没有提供一种数据未传达以后的处理机制,这被认为是上层协议:TCP或UDP要做的事情。
在链路层中我们一般都是通过MAC地址来识别不同的节点,所以在IP层当中我们也需要一个类似的地址标识。那有人就问,
有了IP地址,为什么还要用MAC地址?
原因有以下三点:
1. IP地址本质上是终点地址,它在跳过路由器的时候不会改变,而MAC地址则是下一跳的地址,每跳过一次路由器都会改变。
2. 其实MAC地址并不是必要的,但用MAC地址和IP地址两个地址,用于分别表示物理地址和逻辑地址是有好处的。这样分层可以使网络层与链路层的协议更灵活地替换,网络层不一定非要用『IP』协议,链路层也不一定非用『以太网』协议。
3. 早期的以太网只有集线器,没有交换机,所以发出去的包能被以太网内的所有机器监听到,因此要附带上MAC地址,每个机器只需要接受与自己MAC地址相匹配的包。
IP数据报文的格式暂且不赘述,但是这不代表它不重要,只是我个人认为其对我们的渗透测试的帮助不是很大,本文也是旨在为准入门的盆友们减少学习时间成本。
注:一些大公司面试过程中会问到这些细节问题,但是基础知识点这么多,谁能一一全部都记住呢。
关于这个知识点,网上有很多很多详解,这里进行简述一下。
TCP三次握手原理图
总结三次握手客户端和服务端做了什么?
(专业描述)
第一次握手:Client将标志位SYN置为1,随便产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack (number )=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
总结三次握手客户端和服务端做了什么?
(通俗概括)
第一次握手:Client什么都不能确认;Server确认了对方发送正常。
第二次握手:Client确认了自己发送、接收正常,对方发送、接收正常;Server确认了自己接收正常,对方发送正常,但不知道自己发送是否正常,对方接收是否正常。
第三次握手:Client确认了自己发送、接收正常,对方发送、接收正常;Server确认了自己发送、接收正常,对方发送接收正常。
三次握手的本质
就是双方各一次握手,各一次确认,只是其中一次握手和确认合并在一起。
由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,知道这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,如下图。
(3) 女孩说:“ 收到,那太好了!”于是俩人愉快地交往了,期间男孩邮寄糖果给女孩,女孩邮寄糖果给男孩。
(1) 女孩说:“ 嘿,我没有糖果可以寄给你了 ”
(3) 男孩接着说:“ 我也没有糖果可以寄给你的了 ”
(4) 女孩说:“ 收到 ” 于是俩人愉快地同时分手。
注1:百度上虽然也有很多关于TCP/IP协议的总结,但是我个人认为有一部分知识信息对于准入门的朋友来说是暂时不需要用到的。所以我过滤了各大文章中的一些信息,其中也有部分知识摘自其中,如有冒犯/侵权之处,请联系作者,我们会将其删除。
注2:本文内容肯定有很多不足之处,笔者也知道有很多知识点没提及到,但是内容真的太多了。此处可以理解为偷懒,下一期是对OSI七层模型的详解。
https://developer.51cto.com/art/201906/597961.htm
https://blog.csdn.net/weixin_38885808/article/details/81154983
http://www.ruanyifeng.com/blog/2017/06/tcp-protocol.html