TCP报文格式简介
重要字段列举
序号(sequence number):
Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
确认号(acknowledgement number):
Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
标志位(Flags):
共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
URG:
紧急指针(urgent pointer)有效。ACK:
确认序号有效。PSH:
接收方应该尽快将这个报文交给应用层。RST:
重置连接。SYN:
发起一个新连接。FIN:
释放一个连接。
注意
- 不要将确认序号Ack与标志位中的ACK搞混了。
- 确认方Ack=发起方Seq+1,两端配对。
TCP三次握手
TCP链接建立的基础条件是存在一个客户端,一个服务端。
主动发起连接建立
的应用进程叫做客户
(client)。被动等待连接建立
的应用进程叫做服务器
(server)。
当客户端A想要访问服务器B上的服务,需要与B建立连接了,就要经历如下三次握手过程:
通俗讲解演示
举个栗子:
把客户端比作男孩,服务器比作女孩。用他们的交往来说明“三次握手”过程:
(1)男孩喜欢女孩,于是写了一封信告诉女孩:我爱你,请和我交往吧!;写完信之后,男孩焦急地等待,因为不知道信能否顺利传达给女孩。
(2)女孩收到男孩的情书后,心花怒放,原来我们是两情相悦呀!于是给男孩写了一封回信:我收到你的情书了,也明白了你的心意,其实,我也喜欢你!我愿意和你交往!; 写完信之后,女孩也焦急地等待,因为不知道回信能否能顺利传达给男孩。
(3)男孩收到回信之后很开心,因为发出的情书女孩收到了,并且从回信中知道了女孩喜欢自己,并且愿意和自己交往。然后男孩又写了一封信告诉女孩:你的心意和信我都收到了,谢谢你,还有我爱你!
女孩收到男孩的回信之后,也很开心,因为发出的情书男孩收到了。由此男孩女孩双方都知道了彼此的心意,之后就快乐地交流起来了~~
三次握手动态图演示
第一次握手
客户端向服务端发送连接请求报文段。该报文段的头部中SYN=1,ACK=0,seq=x。请求发送后,客户端便进入SYN-SENT状态。
- SYN=1,ACK=0表示该报文段为连接请求报文。
- x为本次TCP通信的字节流的初始序号。
- SYN=1的报文段不能有数据部分,但要消耗掉一个序号。
第二次握手
服务端收到连接请求报文段后,如果同意连接,则会发送一个应答:SYN=1,ACK=1,seq=y,ack=x+1。该应答发送完成后便进入SYN-RCVD状态。
SYN=1,ACK=1
表示该报文段为连接同意的应答报文。seq=y
表示服务端作为发送者时,发送字节流的初始序号。ack=x+1
表示服务端希望下一个数据报发送序号从x+1开始的字节。
第三次握手
当客户端收到连接同意的应答后,还要向服务端发送一个确认报文段,表示:服务端发来的连接同意应答已经成功收到。
该报文段的头部为:ACK=1,seq=x+1,ack=y+1。客户端发完这个报文段后便进入ESTABLISHED状态,服务端收到这个应答后也进入ESTABLISHED状态,此时连接的建立完成
!
为什么要进行三次握手
因为可能因为网络延迟等缘故,第一次握手时,在时间已经超时后客户端的syn才到服务器端;这个时候尽管客户端知道已经超时失效了,而服务器端还不知道,以为是刚刚发过来的,会回复一个ACK,统一建立连接。
如果不采用三次握手,则此时服务器端发出确认后,连接就正式建立,但是因为客户端并没有发出建立连接的请求,也就不会回应服务器端的ACK,也不会向服务器端发数据。所以服务器端就会一直处于等待状态,浪费了大量的资源。
采用三次握手后,由于服务器向客户端发了SYN后得不到确认,就知道客户端并没有要求建立连接。
四次挥手
所谓的四次挥手即TCP连接的释放(解除)。连接的释放必须是一方主动释放,另一方被动释放。以下为客户端主动发起释放连接的图解:
通俗讲解
举个栗子:
把客户端比作男孩,服务器比作女孩。通过他们的分手来说明“四次挥手”过程。
"第一次挥手":
日久见人心,男孩发现女孩变成了自己讨厌的样子,忍无可忍,于是决定分手,随即写了第一封信
告诉女孩:我们分手吧。
“第二次挥手”:
女孩收到信之后,知道了男孩要和自己分手,怒火中烧,心中暗骂:你算什么东西,当初你可不是这个样子的!于是立马给男孩回了一封回信
:分手就分手,给我点时间,我要把你的东西整理好,全部还给你!
男孩收到女孩的第一封信之后,明白了女孩同意分手。随后等待女孩把自己的东西收拾好。
“第三次挥手”:
过了几天,女孩把男孩送的东西都整理好了,于是再次写信
给男孩:你的东西我整理好了,快把它们拿走,从此你我恩断义绝!“第四次挥手”:
男孩收到女孩第二封信之后,知道了女孩收拾好东西了,可以正式分手了,于是最后一次写信
告诉女孩:好,拜拜,祝你幸福!
「进入正题」
第一次挥手
若A认为数据发送完成,则它需要向B发送连接释放请求。该请求只有报文头,头中携带的主要参数为:
FIN=1,seq=u。此时,A将进入FIN-WAIT-1状态。
FIN=1
表示该报文段是一个连接释放请求。seq=u
,u-1是A向B发送的最后一个字节的序号。
第二次挥手
给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料
网络安全面试题
绿盟护网行动
还有大家最喜欢的黑客技术
网络安全源码合集+工具包
所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!