为什么现在称为IPV4

TCP/IP协议从ARPA阿帕网发展而来,TCP协议早期版本是不分层的,直到第四版才开始分层实现,拆出IP层,所以称为IPV4

TCP 协议的特点

  1. 点对点(不能广播,多播),面向连接
  2. 双向传递(全双工) => TCP 是全双工的,但是HTTP1.1是请求应答模式
  3. 字节流:打包成报文段,保证有序接收,重复报文自动丢弃
    1. 不维护应用报文的边界(对比HTTP``GRPC
    2. 不强制要求应用必须离散的创建数据块,不限制数据块大小
  4. 流量缓冲:解决速度不匹配问题
  5. 可靠的传输服务(保证可达,丢包时通过重发进而增加时延实现可靠性)
  6. 拥塞控制

TCP 的任务

  1. 主机内的进程寻址,通过报文中的端口号
  2. 创建,管理和终止连接
  3. 处理并将字节流打包成报文段
  4. 传输数据
  5. 保持可靠性和传输质量
  6. 流控制和拥塞控制

TCP 报文

image.png

IP 报文

image.png
可以看出IP主要是寻址功能,报文中有源地址和目标地址

UDP 报文

image.png
UDPIP寻址成功的基础上通过端口Port找到进程,从而把数据传输到进程
UDP不管数据是否送到,所以报文非常简单

三次握手

三次握手是为了干什么?

  1. 同步Sequence序列号,初始序列号ISNInitial Sequence Number
  2. 交换TCP通讯参数:滑动窗口等

    三次握手过程

  3. 首先客户端随机初始化请求序列号,发起SYN请求(所谓SYN请求指的是:TCP报文中Flags标志位中SYN所在标志位为1的请求),客户端进入SYN-SENT状态,等待服务端响应

  4. 服务端启动之后就一直处于LISTEN状态,收到客户端请求之后,随机初始化请求序列号,并在客户端请求序列号的基础上+1作为应答序列号,发起SYN+ACK的响应(所谓SYN+ACK的响应指的是响应报文中Flags标志位SYNACK都为1),发出响应之后进入SYN-RECEIVED状态
  5. 客户端收到SYN+ACK响应之后,再次发起ACK的请求,服务端收到之后连接建立,客户端和服务端都进入ESTABLISHED状态

    为什么三次握手过程中ISN是随机的?

    假如ISN不是随机的,是可预测的,那么会发生什么呢?
    场景如下:
    C 冒充 A 的 IP发起 B 服务器的连接请求,那么 C 预测到ACK之后虽然未收到BSYN+ACK请求,但是仍可发起ACK请求,连接建立
    image.png

    为什么握手过程是三次?

    首先TCP是可靠的全双工服务

要保证可靠:就需要一应以答(不然可能丢包了无法发现),这就是两次
比如
客户端说:我要连接啦
服务端说:你连吧

要保证双工:客户端来一次,服务端也需要来一次,就支持双工了

所以握手请求是四次,但是TCP为了性能优化,把服务器的响应和请求合并成了一次,所以就是三次握手