一、TCP和UDP协议
TCP/IP协议中的传输层协议:
TCP 传输控制协议
UDP 用户数据报协议
TCP协议:
TCP是面向连接的、可靠的进程到进程通信的协议。TCP提供全双工服务,即数据可以同一时间双向传输。
UDP协议:UDP协议是无连接、不保证可靠性的传输层协议。发送端不关心发送的数据是否到达目标主机、数据是否出错等,收到数据的主机也不会告诉发送方是否收到了数据,它的可靠性由上层协议来保障。传输数据速度更快,效率更高。
二、TCP报文段
TCP协议抓包可以获取网络中传输的TCP报文的详细内容,包括以下重要字段:
1、源端口号 (Source Port): 发送方使用的端口号。
2、目标端口号 (Destination Port):接收方使用的端口号。
3、序列号(Sequence Number):TCP报文的序列号,用于按序传输和重组数据。
4、确认序列号(Acknowledqment Number):表示接收方期望接收的下一个字节的序列号。
5、数据偏移 (Data offset): TCP报文头部长度,指示数据开始的位置。
6、标志位(Flags):包括SYN、ACK、FIN、RST等标志位,用于控制连接的建立、终止和状态变更。
7、窗口大小(window size):发送方指定的接收窗口大小,用于流量控制。
8、校验和(Checksum):校验TCP报文头部和数据的完整性。
9、紧急指针 (Urgent Pointer):用于指示紧急数据的位置。
10、选项 (Options):可选的TCP协议选项,如最大段长度 (MSS)、窗口扩大因子等。
11、数据(Data):TCP报文携带的应用层数据。
控制位:
URG: 紧急位,紧急指针有效位。数据中存在紧急的数据。
ACK:确认位,只有当ACK=1时,确认序列号字段有效,当ACK=0时,确认号字段无效。
Ack:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号,确认传输是否有问题。
SEQ:tcp报文的序号。
PSH:急迫位,标志位为1时表示整个数据包都很紧急,要加快送到应用层。
RST:重置位,当RST显示为1时,表示要重新建立连接。
SYN:同步位,同步连接。SYN=1时表示进行连接。
FIN:断开位,提出断开连接一方将FIN设为1。
三、抓包分析TCP/IP传输过程(“三次握手”)
1.浏览器打开网页www.baidu.com。
2.打开命令行窗口,输入:ping www.baidu.com,查看IP地址。
3.打开Wireshark软件,点击有波段的以太网2。
4.在下图方框位置输入:ip.addr == 180.101.50.242 and tcp,按下回车键,稍等片刻。
5.“三次握手”抓包及分析
方框处是“三次握手的结果。
注意到”第一次握手”客户端发送的TCP报文中以[SYN]作为标志位,并且客户端序号Seq=0;
接下来”第二次握手”服务器返回的TCP报文中以[SYN,ACK]作为标志位;并且服务器端序号Seq=0;确认号Ack=1(“第一次握手”中客户端序号Seq的值+1);
最后”第三次握手”客户端再向服务器端发送的TCP报文中以[ACK]作为标志位;
其中客户端序号Seq=1(“第二次握手”中服务器端确认号Ack的值);确认号Ack=1(“第二次握手”中服务器端序号Seq的值+1)。
6.“四次挥手”抓包及分析
需要把浏览器的页面关闭,也就是断开TCP/IP连接,之后等待几分钟。会出现下面的画面,方框就是“挥手”过程。
”第一次挥手”客户端发送的FIN请求释放连接报文以[FIN,ACK]作为标志位,其中报文序号Seq=2445;确认号Ack=558;
注意:这里与“第三次握手”的ACK并不是表示确认的ACK报文。
”第二次挥手”服务器端返回的ACK确认报文以[ACK]作为标志位;其中报文序号Seq=558;确认号Ack=2246;
”第三次挥手”服务器端继续返回的FIN同意释放连接报文以[FIN,ACK]作为标志位;其中报文序号Seq=558;确认号Ack=2246;
”第四次挥手”客户端发出的ACK确认接收报文以[ACK]作为标志位;其中报文序号Seq=2446;确认号Ack=559。
为什么“握手”是三次,“挥手”却要四次?
TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。
即SYN建立连接报文与ACK确认接收报文是在同一次"握手"当中传输的,所以"三次握手"不多也不少,正好让双方明确彼此信息互通。
TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。为何建立连接时一起传输,释放连接时却要分开传输?
建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。
释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。