LOnils风迷 's Blog

hacking for fun

0x03 TCP协议分析

    TCP,全称Transfer Control Protocol,中文名为传输控制协议,它工作在OSI的传输层,提供面向连接的可靠传输服务。

    TCP的工作主要是建立连接,然后从应用层程序中接收数据并进行传输。TCP采用虚电路连接方式进行工作,在发送数据前它需要在发送方和接收方建立一个连接,数据在发送出去后,发送方会等待接收方给出一个确认性的应答,否则发送方将认为此数据丢失,并重新发送此数据。

 

 

3.1 TCP头

TCP报头总长最小为20个字节


 

  • 源端口 Source port (16bit):用来传输数据包的端口。
  • 目的端口 Destination port (16bit):指定了接受端的端口号。
  • 序号 Sequence number(32bit):指明了段在即将传输的段序列中的位置,保证其不缺失。
  • 确认号 Acknowledgment number(32bit):规定成功收到段的序列号,确认序号包含发送确认的一端所期望收到的下一个序号。

 

  • 标志 Flags(6bit): 常用 SYN、ACK、PSH、RST、URG、FIN

                       SYN: 表示同步

                       ACK: 表示确认

                       PSH: 表示尽快的将数据送往接收进程

                       RST: 表示复位连接

                       URG: 表示紧急指

                       FIN: 表示发送方完成数据发送

 

  • 窗口 Windows size:TCP接收方的缓冲的字节大小。
  • 校验和 Checksum:校验和包含TCP段头和数据部分,用来校验段头和数据部分的可靠性。
  • 紧急指针 Urgent Pointer:指明段中包含紧急信息,只有当URG标志置1时紧急指针才有效。
  • 选项 Option:指定了公认的段大小,时间戳,选项字段的末端,以及指定了选项字段的边界选项。

3.2  TCP三次握手

    TCP三次握手的过程是这样的,首先发送方主机向接收方主机发起一个建立连接的同步(SYN)请求,接收方主机在收到这个请求后向送方主机回复一个同步/确认(SYN/ACK)应答,发送方主机收到此包后再向接收方主机发送一个确认(ACK),此时TCP连接成功建立。

 


ok,开始分析!(注意其方向)

我们先分析第一个包,我们叫也可以叫它SYN包,可以看见其Flags域为 SYN

(客户端--->服务端)


        从以上包中 我们可以得到其发送包的源端口(随机高端口),目的端口80(说明为上层为HTTP服务)此时Sequence number域为0(0为相对值,实际的值并不为0,若要显示其实际值需在wireshark中设置,为了下面的理解我又截取了sequence的实际值的包。)


    这个序号代表了客户端发送的这个包。

     我们展开SYN域看看


    发现其SYN为1 ,根据其二进制1所在的位置我们不难发现转成16进制后的值为0x002

==============

我们展开第二个包

(服务端--->客户端)


    可以发现多出了一个Acknowledgment number 其值为1 (也是相对值),Acknowledgment的意思为请求,所以加1,表示请求下一个包(间接表明了上一个SYN包已经收到),然后添加一个Sequence number值为0(相对值,但是和前一个包的Sequence number不等同!),代表着服务端发送的数据包。


    在Flags域中可以发现Acknowledgment和Syn 都为1,根据其1的位置,转成16进制为0x012

=========

    最后我们来看第三个包,Sequence number和Acknowledgment number都为1。

(客户端--->服务端)


    改成具体值后发现其Sequence number并无改变(没有用处),而Acknowledgment则在之前SYN/ACK包的sequence上加1了。(握手完成)


    其实三次握手就是相互确认的过程,SYN到对方,对方给你一个ACK,之后对方给你个SYN,你给对方一个ACK。就这么简单。


评论
热度(3)