摘要: WireShark基本使用,TCP报文分析,Http报文分析,顺便复习下TCP/IP,HTTP的知识点。
TCP协议
TCP是一种面向连接的,可靠的基于字节流的传输层协议。
它的报文格式为:
(挺多字段的,挑重点的理解一下:)
-
序列号(Sequence Number):长度为32 bits节。指定了当前数据分片中分配给第一字节数据的序列号。在TCP传输流中每一个字节为一个序号。
如果TCP报文中flags标志位为SYN,该序列号表示初始化序列号(ISN),此时第一个数据应该是从序列号ISN+1开始。 -
确认号(Acknowledgment Number):长度为32bits。是期望收到对方下一个报文段的第一个数据字节的序号。 例如: B正确收到了A的一个报文段,其序号为501,长200字节,则表明B正确收到了A发送的序号到700为止的数据,因此,B期望收到A的下一数据号为701,则B在发送给A的确认报文段中把确认号置位701 (不是700,也不是501)
== 确认号为N,则表明序号到N-1为止的所有数据都正确接收到了== -
TCP flags Tcp在连接中通过Flags标志位来表示传输中的连接状态,可以通过标志位来定位问题。
新版TCPflags字段如下:
简单介绍: 详细请参考-link
FIN: "finished"简写。表示发送者以及发送完数据。通常用在发送者发送完数据的最后一个包中。
SYN: "Synchronisation"简写。表示三次握手建立连接的第一步,在建立连接时发送者发送的第一个包中设置flag值为SYN。
ACK: "Acknowledgment"简写。表示包已经被成功接收。
例题:
- 假设主机A通过一条TCP连接向主机B发送两个紧接着的TCP报文段。第一个报文段的序号为90,第二个报文段序号为110。
a. 第一个报文段中有多少数据?
b. 假设第一个报文段丢失而第二个报文段到达主机B。那么在主机B发往主机A的确认报文中,确认号应该是多少?
a.共有110-90 = 20 字节的数据 (带单位)
b.应该为 90
TCP三次挥手
TCP建立连接的过程叫做握手,握手需要在客户端和服务器之间交换3个TCP报文段。
第一次握手: 客户端向服务器发送连接请求包,标志位SYN(同步序号)置为1,初始序号为seq=J
(TCP规定:SYN报文段(即SYN=1的报文段)不能携带数据,但要消耗掉一个序号,这是TCP客户端进入SYN-SENT(同步已发送)的状态)
第二次握手: 服务器收到客户端发过来报文,由SYN=1知道客户端要求建立联机。向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始序号seq=K,将确认序号设置为客户的序列号加1即ack=J+1
此时TCP服务器进入SYN-RCVD(同步收到)的状态
第三次握手: 客户端收到服务器发来的包后检查确认序号是否正确,即J+1。以及标志位ACK是否为1。若正确,客户端再次发送确认包,ACK标志位为1,SYN标志位为0。服务器收到后确认序号值与ACK=1则连接建立成功,可以传送数据了。