传输层协议 udp tcp

文章目录

  • UDP协议
    • 协议头
  • TCP
    • 协议头
    • 建立连接-3次握手
    • 断开连接-4次挥手
    • 总结

UDP协议

  • 特点:
    有差错检测(校验和)
    无差错纠正、队列管理、重复消除、流量控制、拥塞控制
    不保证到达目的地。

  • 应用层自己实现数据包的处理控制等

  • 应用层把自己的数据包装成一个udp数据报,进而包装成ip数据报。

协议头

传输层协议 udp tcp_第1张图片

  • 一共8字节 64位
    源端口号(16):如果不需要回复,可以设置成0。
    目的端口号(16):
    数据长度(16):头部+数据(单位:字节),最大64k字节。不过这个信息冗余了。因为ip头里包含了ip数据报长度。
    校验和(16):校验 udp头部+udp数据+伪头部。和ip头的校验和不同,这个校验和一般不变(除非经过了nat)。

  • 注意,ip头指出了传输层协议类型,因此udp协议里没有再次指出是udp协议。udp的端口和tcp的端口独立。可以相同。不过通常会把同一个端口(tcp和udp的)分配给同一个服务。

  • 还有一个12字节伪头部,信息来源于ip头。用于计算校验和:
    4字节源ip
    4字节目标ip
    1字节0
    1字节协议号(即udp)
    2字节udp长度(头+数据)

  • 校验和的计算:
    按照16个比特一组划分,经过计算,得出一个16比特的数字

  • 如果使用ipv4,ipv4要求的mtu是576字节。(路由器或主机)ip层传输ip数据报的时候会判断当前端口的mtu,如果mtu小于ip数据报长度,ip数据报会被分割。里面的udp数据也被分割成多个。因此共容易丢包(丢失一个分片,就整个数据报都没用了)。因此udp要稍微避免分片,tcp要极力避免分片。

TCP

  • 特点:面向连接,可靠的字节流服务。
    tcp把字节流转换成 组包。分组的第一个字节是偏移量(暗示顺序,且说明组包可以边长)

  • tcp是对等的。双工传输。因此一个组包里包含了ack,流量控制的参数,也包含数据。

  • 知识点:
    校验和,重传计时器,

协议头

  • 20字节(不带选项)
    -传输层协议 udp tcp_第2张图片

源端口(16)
目标端口(16)

序列号(32)seq:当前包的序列号,不是序号,是字节的偏移量,无符号整数

确认号(32):我希望接收的序列号。(我确认收到了的字节数+1)。只有当标志里面的ack标记为1时才有意义。

头部长度(4):指定头部长度。一般是20(字节)
保留(4):全是0,没用。
标志(8):后面详细介绍。
窗口大小(16):最大65535字节,限制了最大吞吐性能

tcp校验和(16):强制使用。
紧急指针(16):URG为1时有用,指向紧急字节

其他可选参数

  • 标志:
    CWR
    ECE
    URG:紧急,用的少
    ACK:确认,建立连接后一般都是启用
    PSH:
    PST:
    SYN: 客户端第一次发送才是1。同时此时的序列号是初始序列号。
    FIN:

  • 可选参数
    MSS:指定自己能够接收的最大字节数,默认是536(576 -20 tcp头-20 ip头)。有时候会设置成1460(1500以太网最大帧-20 tcp头-20 ipv4头) 1440(1500以太网限制-20 tcp头-40 ipv6头)
    SACK_permit: 允许对方sack,我有解析能力
    SACK:指定空洞位置。比如接受了1 3号包,空洞就是2
    WSOPT:窗口缩放
    TSOPT:时间戳。用于估计往返时间
    UTO:用户超时
    TCP-AO:认证。

一个tcp由一对套接字,或者说一个四元组组成(客户ip 客户端口 服务器ip 服务器端口)
套接字:一个ip+端口称为套接字,或者端点。endpoint

建立连接-3次握手

客户端:SYN=1;seq_c=ISN(c ),
服务器:SYN=ACK=1;ackN=ISN(c )+1,seq_s=ISN(s)
客户端:ACK=1;ackN=ISN(s )+1,seq_c=ISN(c )+1

  • 解释:
    SYN表示连接建立。建立连接时置为1。其余时间为0
    ACK、ackN 确认收到对方的数据。ack表示确认,希望下次接收ackN 。
    FNI:发起关闭请求

意义:告知双方自己的序列号,如seq_c=ISN(c )。

断开连接-4次挥手

客户端:FNI=ACK=1;seq=K,ACK=L
服务器:ACK=1,seq=L,ack=K+1

服务器:FIN=ACK=1;seq=L,ACK=K+1
客户端:ACK=1; seq=K,ack=L+1

总结

tcp的基本开销是7个报文段。因此当传输数据少的时候,可以用udp。不过udp需要应用层实现错误修复、拥塞管理、流量控制等。

你可能感兴趣的:(其他,udp,tcp/ip,网络)