tcp
http封装
Ethernet2(以太网2帧头) | IPV4 | TCP | HTTP | FCS(以太网2帧尾)
tcp端口号
- 取值范围
- 16bit 范围0-65535 0–2^16-1
- 1-1023 知名端口
- 1024-65535 非知名端口
tcp信道协议种类
- 单信道协议:一个应用程序对应一个端口
- 多信道协议:一个应用程序对应多个端口,比如ftp,tcp20(控制端口)和tcp21(数据端口)
tcp对带宽抢占率远低于udp
tcp头部封装
- tcp header 取值范围20Byte-60Byte。
- header length,因为长度可变,该字段告诉接受者tcp报头长度。
- Resv. 保留字段全部置0。
- 6个控制位,syn置1 则表示发送syn,也就是三次握手的第一个阶段。
- URG,服务器一对多处理报文的时候,如果tcp URG置为1,则优先对这些数据进行处理。
- 只有当需要对tcp启用高级功能的到时候,才需要添加options可选项
- padding是因为三层包头和四层包头大小都必须被4整除,所以当options选项被使用的时候,无法被4整除的时候,对padding进行用连续的0填充,填充到可以被4整除
- ergent pointer 紧急指针配合URG位,让多股tcp应用,哪一股被优先处理
三次握手
四次挥手
面向连接协议:
- 流量控制
- 限速,(源末两端接受带宽不一致,如果源端带宽大,全速发送给接收端,则接收端会产生拥塞。) 在发送数据之前进行协商速率,通过windown字段(单位字节,Byte)进行协商,比如协商为100字节,则源端发送100字节数据给接收端,接收端收到后,返回一个确认给源端,如果没确认,则表示数据丢失,需要数据重传。窗口不是固定不变,在每次发送流量之前都会进行windown协商。
带宽大的时候,窗口经过协商会变大,直到占用链路最大字节的时候,又会控制窗口大小,防止拥塞发生,这种行为称之为滑动窗口。 - tcp延迟启动(slow start) 第一次协商为1 字节, 第二次为2字节 第n次为2^(n-1)次方,(下载的时候先比较小,然后逐渐变大)
- 全局同步问题:slow start 窗口逐渐变大,当超出阈值带宽的时候,会减半,然后又逐渐变大,触发阈值再减半,依次循环。其带宽利用是一个折线。平均带宽利用不会百分百打满。当存在大量tcp应用的时候,此时这些应用一起发送数据的时候,就会出现全局同步的问题,大家都在利用带宽,发现不足了,瞬间减半窗口。
- 滑动窗口的协商发生在接收方回复syn-ack的时候。
- 限速,(源末两端接受带宽不一致,如果源端带宽大,全速发送给接收端,则接收端会产生拥塞。) 在发送数据之前进行协商速率,通过windown字段(单位字节,Byte)进行协商,比如协商为100字节,则源端发送100字节数据给接收端,接收端收到后,返回一个确认给源端,如果没确认,则表示数据丢失,需要数据重传。窗口不是固定不变,在每次发送流量之前都会进行windown协商。
- 防乱序
- 处理延迟,串行化延迟,传输延迟,队列延迟
- 队列延迟,导致源给目的地发送多个数据,导致乱序—-抖动。
- 通过squence number来标记数据包,进行顺序接受。
- 防丢包
- acknowlegde number中包含一个确认号,确认号的值通常为发送方发送的最大序列号值加1。比如发送方发送 1 2 3 ,则接收方发送确认号4,发送方知道4后,接着发送4 5 6。如果接收方只收到了4 5 ,则其返回确认号为6,那么发送方发现接收方漏了6,则对6进行重发。 如果发送方只收到了4,返回了确认号5, 那么发送方会对 5 6 都重发。
- 完整性检查
- 根据接收到的数据跟tcp中的checksum字段比较。因为并不是HMAC的方式,所以无法检测数据是否被篡改,只能检测流量在发送的时候是否因为拥塞导致冲突。
- 数据重传
- 根据发送方发来的确认号,以及发送过去的序列号,对比查看是否需要重传。
tcp注意点
tcp只支持单播(unicast)数据的发送,如果用了tcp,则无法组播或者广播。相对udp不够灵活,udp支持单播 组播 广播。
完全连接,完成三次握手。
半开连接,发送端未发送最后一次ack的连接,接收端不会自动断开,会默认被保持,且消耗服务器内存和cpu。
udp
面向无连接,不可靠传输
封装
ip header | udp header | data
udp头部报文
udp头部占用8字节,传输时候没有确认机制。
udp主持组播和广播
媒体流量基本用udp封装,所以媒体对序列的要求,则封装一个rtp(实时传输协议)的包头,其squence 为12字节,保证源末报文可以根据序列进行重组。 ethernet2 | udp | rtp | VoIP | FCS
tcp udp对比
- 可靠 tcp强
- 安全 udp强 tcp 三次握手容易被攻击
- 带宽利用 udp利用高 tcp存在全局同步的问题,解决办法 QoS WRED加权随机早期检测
- 应用灵活 tcp只支持单播,udp更加灵活
- 不用支持重传的服务 VoIP 用udp