Lazy loaded image
技术分享
TCP/IP协议
00 min
2019-2-2
2024-11-25
type
status
date
slug
summary
tags
category
icon
password

1. 端口

运输层使用 UDPTCP 协议,实现源端口目的端口的数据传输,为应用进程之间提供端到端的逻辑通信
发起通信请求,必须知道对方的服务器 IP端口号
常用服务的默认端口号
notion image

2. UDP 和 TCP

用户数据报协议 UDP(User Datagram Protocol)
  • 发送数据不需要建立连接
  • 尽最大努力交付,不保证一定交付
  • 对应用层传下来的报文添加首部后就交付给网络层
  • 没有拥塞控制,允许网络阻塞时丢失一些数据(比如看直播时画面卡一下)
  • 支持一对一、一对多、多对一、多对多
  • 首部占用小,只需要8个字节
传输控制协议 TCP(Transmission Control Protocol)
  • 发送数据前必须先建立TCP连接,传输完成后释放TCP连接
  • 每条TCP连接都是点对点,端点叫做套接字(socket,即 IP地址 :端口号
  • 同一IP可以有多个不同的TCP连接,同一端口号可以用在多个不同的TCP连接中
  • 连接的两端既发送报文,也接收报文,并设有缓存来存储将发送和已收到的数据
  • 提供可靠服务,数据不会出错、丢失,并按顺序到达
  • 把应用层传下来的数据看作无结构的字节流发送,接收方应用层再还原字节流
  • 首部最少占用20个字节,最大60字节
notion image

3. 首部格式

UDP 首部
notion image
  • 源端口:需要对方回信时选用,不需要时全0
  • 目的端口:终点交付报文,必须使用,若目的端口不存在则丢弃
  • 长度:记录UDP数据报长度,最短为8字节,即仅有首部,无数据部分
  • 检验和:利用伪首部检测UDP数据报传输中是否出错,有错则丢弃
TCP 首部
notion image
  • 源端口、目的端口:与UDP一样,各占2字节
  • 序号:TCP字节流每个字节都按顺序编号,序号记录本段报文第一个字节的编号
  • 确认号:期望收到对方下一个报文所应该的序号值
  • 数据偏移:记录TCP首部长度,其字段值以 4个字节 为单位
  • 保留:保留为今后使用,后面跟6个控制位
  • 窗口值:告诉对方,从确认号开始允许发送的最大数据量,以1字节为单位
  • 检验和:和UDP一样,加伪首部计算检验和
  • 紧急指针:指出本段报文紧急数据的字节数
  • 选项:一些可选的附加数据,最长40字节

4. TCP三次握手

  • SYN:SYN=1表示该报文是一个连接请求,且不能携带数据
  • ACK:当ACK=1时确认号才有效,建立连接后传送的报文必须都把ACK置为1
notion image
  1. 服务端B开启后,处于Listen监听状态,等待客户端的连接请求
  1. 客户端A发起请求,SYN置为1,选择一个起始序号seq,假设为x,由于不携带数据,因此只占用这一个序号
  1. 服务端B收到请求,发送确认给A,将ACK置为1,表示确认号ack生效,由于收到的报文没有数据,所以确认号 ack = x + 1,同时B也选一个初始序号seq,假设为y
  1. 客户端A收到B发送来的确认,A再发送一个确认给B,确认号为 ack = y + 1,序号为 seq = x + 1
  1. B收到A的确认,连接建立

5. TCP四次挥手

  • FIN:连接终止,当FIN=1表示请求释放连接
    • notion image
  1. A发送请求关闭连接,FIN置为1,进入第一关闭等待状态
  1. B收到关闭请求,发送确认给A,并通知上层应用进程,不再接收来自A的数据
  1. A收到B的确认后,进入第二关闭等待状态,不再给B发送数据
  1. B发完给A最后的数据后,B也发送关闭连接请求,FIN置为1
  1. A收到B的关闭请求,最后给B再发送一次确认,然后进入时间等待状态
  1. B收到A最终确认,完全关闭连接
  1. A在时间等待状态内保证了最后一个确认能到达B,假如最后的确认丢失,B会再次发送FIN为1的请求,A再次发送最终确认,继续进入时间等待状态
上一篇
SQL 必知必会
下一篇
计算机语言