一、TCP数据包简介
简单说一下传输层的复杂点:
- 既有TCP协议,又有UDP协议;
- 安全加密协议TLSv1.2;
- 以及在传输层之上的各种协议;
本篇我们只考虑TCP协议的内容!!!
TCP数据包的控制位
1、数据包流程——方便理解包如何由硬件向高层传输
(1)浏览器(客户端)生成请求;
(2)委托操作系统发送请求;
(3)由网卡将消息转换成相应的信号后,发送到网络中;
(4)Web服务器收到请求后,通过网卡(网线)回复数据包;
(5)由操作系统(协议栈)整理,暂时存入缓冲区中(这个是重点);
(6)然后TCP有个优点——即窗口从缓冲区中读取数据;
(7)最后是发给高层应用;
2、TCP控制位
再说三次握手之前,我觉得有必要说说TCP包的控制位,控制位占了6个比特。
- URG —— 表示紧急指针。Urgent
如果数据包有这个字段,回复的时候不必经过缓冲区进行排队直接交给高层应用 (相当于有免死金牌) - ACK —— 表示数据包接收到了。给对方一个回复,通知的作用。Acknowledgment。
- PSH —— 数据在缓冲区中,协议栈给它排队“ 你排第一好了 ” 下次第一个发的包就是 push。
- SYN —— 发送方和接收方需向确认序号,用于连接操作。
- FIN —— 正常断开连接。
3、TCP的三次握手
直接上图:
(1)A 给 B先发一个SYN包,用去确认连接操作;
(2)B 收到包后给A回复一个SYN/ACK包,用于确认并且告诉A我收到了;
(3)A 发送一个ACK包,告诉B我也收到了。
这样三次握手才算成功!连接才建立成功!接下来才可以进行正常的数据传输了!!!
二、通过抓包分析
上面三次握手成功后,连接才建立成功,接下来将是正常的数据传输!!!
1、第一个包 FIN/ACK包
2、第二个数据包 SYN
3、第三个数据包 SYN/ACK
4、第四个数据包 ACK(看窗口大小,可知这个包是回复的数据包);
5、来看个 RST/ACK 数据包;
6、ACK/PSH
6.1> 在Linux下可以通过以下命令查看和设置窗口扩大因子功能;
在Linux下可以通过以下命令查看和设置窗口扩大因子功能:
命令:cat /pro/sys/net/ipv4/tcp_windows_scaling
7、TLS加密
- GMT 格林尼治平均时。 这是因为世界上时间和地理有关,为了有个统一的对话基础
将GMT作为(0时区)基准。- 在GMT下 ,Unix time,Unix epoch,POSIX time,Unix timestamp
可以认为上面时间是一致的,数值上都从1970年1月1日0时到当前的秒数。
可以看到为了安全性的加密,所使用的加密算法布置一种。
接下来就是服务求交换密码;
一个包做了三件事:
这样连接过程建立后,接下来传输的数据就是加密的。
8、看看几个异常的TCP包
(1)TCP ZeroWindow
通过Socket编程,发送TCP包,如果只send,不Recv的话,会导致TCP ZeroWindow,导致双方无法继续发送数据,一段时间后TCP就会断开。
(2)TCP虚假重传
一般原因:
- 移动网络切换过程可能导致虚假重传;
- 网络带宽较小时;
- 原始包和重传包丢包。
(3)TCP Retransmission 重传
Warning 是 RST