计算机网络-4,搞懂 TCP,UDP

160 阅读8分钟

套接字

大话

  • create: 联系打招呼
  • bind 起个名字
  • listen 告诉有空
  • connect 我说
  • accept 你听
  • write 嘴巴说
  • read 耳朵听
  • close 对话结束

专业

  • create: 创建一个 socket
  • bind 套接字标识,一般用于绑定端口号
  • listen 准备接收连接
  • connect 准备充当发送者
  • accept 准备作为接收者
  • write 发送数据
  • read 接收数据
  • close 关闭连接

socket

大话

  • 文件描述符fd: 外卖订单编号, 美食如何做,采购食材等由商家处理
  • 既定端口号: 房子的构造会有厕所
  • 时序分配的端口号: 设计师分配房子其他非必要构造

专业

  • 操作系统,它用于帮我们管理计算机可以使用的资源,当我们的程序要使用一个资源的时候,可以向操作系统申请,再由操作系统为我们的程序分配和管理资源。通常当我们要访问一个内核设备或文件时,程序可以调用系统函数,系统就会为我们打开设备或文件,然后返回一个文件描述符fd(或称为ID,是一个整数),我们要访问该设备或文件,只能通过该文件描述符。
  • 标准既定的端口号

标准既定的端口号是静态分配的,每个程序都会有自己的端口号,每个端口号都有不同的用途。端口号是一个 16 比特的数,其大小在 0 - 65535 之间,0 - 1023 范围内的端口号都是动态分配的既定端口号,例如 HTTP 使用 80 端口来标识,FTP 使用 21 端口来标识,SSH 使用 22 来标识。这类端口号有一个特殊的名字,叫做 周知端口号(Well-Known Port Number)

  • 时序分配的端口号

第二种分配端口号的方式是一种动态分配法,在这种方法下,客户端应用程序可以完全不用自己设置端口号,凭借操作系统进行分配,操作系统可以为每个应用程序分配互不冲突的端口号。这种动态分配端口号的机制即使是同一个客户端发起的 TCP 连接,也能识别不同的连接。

多路复用和多路分解

大话

  • 无连接
  • 目的 IP 地址 : 房间地址
  • 目的端口号 : 房间号
  • 连接
  • 源 IP 地址、目标 IP 地址、源端口号、目标端口号

UDP 报文结构

大话

  • 源端口号(Source Port) : 我的房间号
  • 目标端口号(Destination Port): 对方的房间号
  • 长度(Length) : 消息长度
  • 校验和(Checksum): 用于判断是否出错

专业

  • 源端口号(Source Port) :这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选项,有时不会设置源端口号。没有源端口号就默认为 0 ,通常用于不需要返回消息的通信中。
  • 目标端口号(Destination Port): 表示接收端端口,字段长为 16 位
  • 长度(Length): 该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8,最大长度为 65535 字节。
  • 校验和(Checksum):UDP 使用校验和来保证数据安全性,UDP 的校验和也提供了差错检测功能,差错检测用于校验报文段从源到目标主机的过程中,数据的完整性是否发生了改变。发送方的 UDP 对报文段中的 16 比特字的和进行反码运算,求和时遇到的位溢出都会被忽略

TCP 概念

大话

  • 全双工服务(full-duplex service) 双向沟通
  • 点对点(point-to-point) 一对一辅导
  • 发送缓存(send buffer) 临时数据
  • 块(chunk) 蛋糕切块
  • 报文段(segment): 蛋糕块添加的 TCP 头
  • 最大数据长度(Maximum Segment Size),俗称 MSS 蛋糕的最大块是多大
  • Maximum Transmission Unit ,最大传输单元 MTU : 传输种类 汽车还是火车

TCP 报文段结构

蛋糕如何切, 运输途中出现问题如何处理

大话

  • 32 比特的序号字段(sequence number field) : 数据流的字节编号 分段 , 每个分段的字节开头
  • 32 比特的确认号字段(acknowledgment number field) 由这次数据给出期望值
  • 4 比特的首部字段长度字段(header length field)
  • 16 比特的 接受窗口字段(receive window field) 大小控制
  • 可变的选项字段(options field) 最大报文长度
  • 6 比特的 标志字段(flag field) 标识
    • ACK 标志用于指示确认字段中的值是有效的,这个报文段包括一个对已被成功接收报文段的确认;
    • RSTSYNFIN 标志用于连接的建立和关闭;
    • CWRECE 用于拥塞控制;
    • PSH 标志用于表示立刻将数据交给上层处理;
    • URG 标志用来表示数据中存在需要被上层处理的 紧急 数据。
      • 紧急数据最后一个字节由 16 比特的紧急数据指针字段(urgeent data pointer field) 指出。

专业

  • 序号字段

    • 假设数据是 10000 字节,MSS 是 2000 字节,那么 TCP 就会把数据拆分成 0 - 1999 , 2000 - 3999 的段,依次类推
    • 第一个数据 0 - 1999 的首字节编号就是 0 ,2000 - 3999 的首字节编号就是 2000
  • 确认号 我发了 0-10字节,期望下次是 11字节-剩下的字节, 那么确认号就是 11

    • 单工通信 广播
    • 全双工 电话 TCP
    • 半双工 对讲机
  • 累积确认

    • 超时重发
    • 我传过去丢包
    • 他传过来丢包
    • 他传过来未丢包,但是超时了
      • 接收方立刻丢弃失序的报文段
      • 接收方接受失序到达的报文段,并等待后续的报文段(推荐)
  • 窗口

    • 前面是一问一答
    • 不用等回答发送多个报文
  • 滑动窗口(Sliding window)

    • 分段块很多的处理, 比如 每次处理 10 个, 第一次发前 10块(1-10), 若接收到第一个 那么向前滑动, 变为处理(2-11) 以此类推, 同时 第 1 块的缓存也会被释放
  • 高速重发控制 A 若第一次失败不会等待继续发送, B 确认号没有响应 那么 冗余 ACK(响应) 多次重复发送给 A , 最后 A 会重传

  • 流量控制服务(flow-control service)

    • 原因: 商家订单并不是马上做, 而是等待超市商品,当商家做菜速度过慢,那么订单就会爆满无法交货
    • 解决: 接收窗口(receive window) 这个东西来告诉平台我还能做多少单

连接管理

大话

  • 三次握手

    • 特殊的 TCP 报文段:
      • SYN 标志位 1 1 0 (3次)
      • 初始序列号(client_isn) 客户端 0, +1 (SEQ, ACK)
      • 初始序号(server_isn) 服务端 0, +1 (SEQ, ACK)
    • 关闭: FIN=1, ACk 四次挥手简化
      • 我要关闭我告诉你, 你收到信息告诉我你收到我要关闭的信息
      • u ->, <- v, u+1 (FIN-WAIT-1 , CLOSE-WAIT)
      • 你也说我要关闭, 我发送信息给你说收到知道你要关闭的信息
      • u+1, w+1 -> , <- w, u+1 (FIN-WAIT-2丶TIME-WAIT, LAST-ACK)
    • 被动打开(passive open) 耳朵
    • 主动打开(active open) 嘴巴
  • 四次挥手

    • FIN-WAIT-1 : 第一次发出,等待回答前的状态
    • MSL 是 TCP 报文段可以存活或者驻留在网络中的最长时间
    • TIME-WAIT 等待 2MSL

专业

在一个 TCP 连接的生命周期内,运行在每台主机中的 TCP 协议都会在各种 TCP 状态(TCP State) 之间进行变化,TCP 的状态主要有 LISTEN、SYN-SEND、SYN-RECEIVED、ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、CLOSING、LAST-ACK、TIME-WAIT 和 CLOSED 。这些状态的解释如下

  • LISTEN: 表示等待任何来自远程 TCP 和端口的连接请求。
  • SYN-SEND: 表示发送连接请求后等待匹配的连接请求。
  • SYN-RECEIVED: 表示已接收并发送连接请求后等待连接确认,也就是 TCP 三次握手中第二步后服务端的状态
  • ESTABLISHED: 表示已经连接已经建立,可以将应用数据发送给其他主机

上面这四种状态是 TCP 三次握手所涉及的。

  • FIN-WAIT-1: 表示等待来自远程 TCP 的连接终止请求,或者等待先前发送的连接终止请求的确认。
  • FIN-WAIT-2: 表示等待来自远程 TCP 的连接终止请求。
  • CLOSE-WAIT: 表示等待本地用户的连接终止请求。
  • CLOSING: 表示等待来自远程 TCP 的连接终止请求确认。
  • LAST-ACK: 表示等待先前发送给远程 TCP 的连接终止请求的确认(包括对它的连接终止请求的确认)。
  • TIME-WAIT: 表示等待足够的时间以确保远程 TCP 收到其连接终止请求的确认。
  • CLOSED: 表示连接已经关闭,无连接状态。

上面 7 种状态是 TCP 四次挥手,也就是断开链接所设计的。

最后

欢迎加我讨论