从一个HTTP请求来读懂HTTP、TCP协议( 三 )

  • 字段原则上不能重复,除非这个字段本身的语义允许,例如 Set-Cookie 。
  • HTTP 协议中有非常多的头字段,但基本上可以分为四大类:通用标头、实体标头、请求标头、响应标头 。
    HTTP 头字段更多内容请查看《深入掌握HTTP四种标头基本概念 》
     
    TCP 协议 
    TCP(Transmission Control Protocol),传输控制协议:面向连接的,可靠的,基于字节流的传输层通信协议 。它能帮助你确定计算机连接到 Internet 以及它们之间的数据传输 。通过三次握手来建立 TCP 连接,三次握手就是用来启动和确认 TCP 连接的过程 。一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接 。
     
    TCP特点 
    • 基于连接的:数据传输之前需要建立连接
      全双工的:双向传输
    • 字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
    • 流量缓冲:解决双方处理能力的不匹配
    • 可靠的传输服务:保证可达,丢包时通过重发机制实现可靠性
    • 拥塞控制:防止网络出现恶性拥塞
     
    TCP报文格式 
    从一个HTTP请求来读懂HTTP、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, 窗口信息,指定校验和算法)
     
    在了解具体流程之前,我们先认识几个概念
    从一个HTTP请求来读懂HTTP、TCP协议

    文章插图
     
    最初两端的TCP进程都处于CLOSED关闭状态,A主动打开连接,而B被动打开连接 。
    A、B关闭状态CLOSED — B收听状态LISTEN — A同步已发送状态SYN-SENT — B同步收到状态SYN-RCVD— A、B连接已建立状态ESTABLISHED
    B的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 。

    从一个HTTP请求来读懂HTTP、TCP协议

    文章插图
     
    下面通过一个案例看三次握手是怎么进行的
    • 在Nginx服务器部署一个静态页面(我的端口为:8000)

    从一个HTTP请求来读懂HTTP、TCP协议

    文章插图
     
    • tcpdump指定网卡进行监听抓取报文
    tcpdump -i en0 -S -c 3 port 8000
    • 在客户端使用nc网络工具发送一个请求
    nc 192.168.109.200 8000
    • 三次握手监听结果如下:

    从一个HTTP请求来读懂HTTP、TCP协议

    文章插图