HTTP 头字段更多内容请查看《深入掌握HTTP四种标头基本概念 》
TCP 协议
TCP(Transmission Control Protocol),传输控制协议:面向连接的,可靠的,基于字节流的传输层通信协议 。它能帮助你确定计算机连接到 Internet 以及它们之间的数据传输 。通过三次握手来建立 TCP 连接,三次握手就是用来启动和确认 TCP 连接的过程 。一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接 。
TCP特点
- 基于连接的:数据传输之前需要建立连接
全双工的:双向传输 - 字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
- 流量缓冲:解决双方处理能力的不匹配
- 可靠的传输服务:保证可达,丢包时通过重发机制实现可靠性
- 拥塞控制:防止网络出现恶性拥塞
TCP报文格式
文章插图
- 16位源端口/16位目的端口:负责实现应用程序之间的数据传输
- 32位序号/32位确认序号:用于实现tcp在传输层的包序管理——tcp有序交付数据
- 4位头部长度:以4个字节为单位;4位保存的最大数字是15;因此tcp报头最大长度是15*4=60个字节
- 6位保留位;
- 6位标志:
-
- URG——紧急指针标志
- ACK——确认回复标志
- PSH——提示立即接受位
- RST——重置连接位
- SYN——连接建立请求位
- FIN——断开连接请求位
- 16位窗口大小:滑动窗口机制–>流量控制–>告诉对端所能发送的最大数据量
- 校验和:二进制反码求和–>校验数据一致性
- 紧急指针:指明哪些数据是紧急数据
- 选项数据:三次握手时,协商MSS大小的数据
TCP连接:四元组[ 源地址,源端口,目的地址,目的端口 ]
TCP三次握手
- 同步通信双方初始序列号( ISN, initial sequence number )
- 协商TCP通信参数(MSS, 窗口信息,指定校验和算法)
在了解具体流程之前,我们先认识几个概念
文章插图
最初两端的TCP进程都处于CLOSED关闭状态,A主动打开连接,而B被动打开连接 。
A、B关闭状态CLOSED — B收听状态LISTEN — A同步已发送状态SYN-SENT — B同步收到状态SYN-RCVD— A、B连接已建立状态ESTABLISHEDB的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求 。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求 。若有,则作出响应 。
- SYN:它的全称是 Synchronize Sequence Numbers,同步序列编号 。是 TCP/IP 建立连接时使用的握手信号 。在客户机和服务器之间建立 TCP 连接时,首先会发送的一个信号 。客户端在发送 SYN 消息时,就会在自己的段内生成一个随机值 X 。
- SYN-ACK:服务器收到 SYN 后,应答客户端连接,发送一个 SYN-ACK作为答复 。确认号设置为比接收到的序列号多一个,即 X + 1,服务器为数据包选择的序列号是另一个随机数 Y 。
- ACK: Ackowledge character,确认字符,表示发来的数据已确认接收无误 。最后客户端将 ACK 发送给服务器 。序列号被设置为所接收的确认值即 Y+ 1 。
文章插图
下面通过一个案例看三次握手是怎么进行的
- 在Nginx服务器部署一个静态页面(我的端口为:8000)
文章插图
- tcpdump指定网卡进行监听抓取报文
tcpdump -i en0 -S -c 3 port 8000
- 在客户端使用nc网络工具发送一个请求
nc 192.168.109.200 8000
- 三次握手监听结果如下:
文章插图