TCP和UDP的基础知识
前言
运输层两个协议TCP和UDP,真正做到主机进程到主机进程的传输,它的上层应用层定义的是和端到端无关的规定,它的下层网络层定义的是数据在网络间的转发。
学习首部格式的意义:
运输层就两个协议:TCP和UDP。UDP功能较少,用的也较少(幸运的是要学的也少)。TCP用的多,主要原因是他功能强大,如建立连接、保证可靠、实现流量控制和拥塞控制,所以要学的也多。TCP和UDP的这些功能能够实现是基于他们的首部数据,所以我们这节将先学习首部格式。
TCP和UDP的定义和区别
传输控制协议TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。仅支持单播传输。提供拥塞控制、流量控制等功能。首部最小20字节,最大60字节。大多数场景下使用
用户数据报协议UDP是一个简单的面向数据报的传输层协议,提供的是非面向连接的、不可靠,尽最大努力交付的数据传输。支持一对一、一对多和多对多的交互通信。没有拥塞控制,适合实时性强的应用 。首部开销小,仅8字节。适合实时视频回忆、DNS、TCP等协议的控制查询报文。
区别:
TCP | UDP | |
---|---|---|
是否连接 | 面向连接的 | 无连接的 |
是否可靠 | 可靠的 | 不可靠,尽最大努力交付 |
连接对象个数 | 点对点的全双工通信 | 支持一对一、一对多和多对多的交互通信 |
传输方式 | 基于字节流的 | 面向报文的,即对应用层的报文不拆分也不合并 |
拥塞控制和流量控制 | 有 | 没有拥塞控制,适合实时性强的应用 |
首部开销 | 首部最小20字节,最大60字节 | 首部开销小,仅8字节 |
适用场景 | 除UDP的场景 | 功能少、要求低。适合实时视频回忆、DNS、TCP等协议的控制查询报文 |
UDP的用户数据报首部格式
UDP长度:最小为8,即只有首部
UDP检验和:计算时会临时增加一个伪首部(包括源IP、目标IP、UDP长度等)计算后删除
伪首部, 又称为伪包头(Pseudo Header):是指在 TCP 的分段或 UDP 的数据报格式中,在数据报首部前面增加源 IP 地址、目的 IP 地址、IP 分组的协议字段、TCP 或 UDP 数据报的总长度等共12字节,所构成的扩展首部结构。此伪首部是一个临时的结构,它既不向上也不向下传递,仅仅只是为了保证可以校验套接字的正确性。
计算方法 发送方 1.检验和置0 2.把伪首部、首部和数据部分拆分为16位的字串 3.按二进制反码计算出这些16位字的和 4.将和求反填入校验和字段 接收方 1.按发送方2、3步计算出结果 2.无差错时结果为1,否则出错
TCP的报文段首部格式
序号:TCP对字节流的每个字节都按顺序编号,序号指的是本报文段所发送的数据的第一个字节的序号
确认号ack:期望收到对方下一个报文段的第一个数据字节的序号,同时表明前面的所有数据都已经收到了
数据偏移:数据起始处距离报文段的起始处多远,实际指出的是TCP报文段的首部长度
保留:占6位,目前为0,没被使用
控制位:
-
紧急URG:URG=1代表开启紧急指针
-
确认ACK:ACK=1代表首部带确认好ack
-
推送PSH(PuSH):URG=1立即把报文段发送出去,不再等到缓存都填满后再向上交付
-
复位RST(ReSeT):RST=1释放连接,重新建立运输连接
-
同步SYN:SYN=1说明在建立连接同步序号
-
终止FIN:数据已发送完毕,释放连接
窗口(重点):发送本报文段的一方的接收窗口大小,让接收本报文段的接收方设置其发送窗口大小值。用于流量控制
检验和:和UDP一样,伪首部第四个字段为6
紧急指针:指出紧急数据的大小,即紧急数据的末尾(从0到末尾)
选项:最大报文段长度MSS、时间戳等等