TCP/UDP

传输协议之-TCP/UDP

对比

TCP 可靠 面向连接-类似打电话/收到扣1 但是效率比较低
UDP 不可靠的 面向无连接-类似群聊 效率高
eg:QQ传文件-TCP(保证文件完整),发消息-UDP

数据包结构

TCP

tcp三次握手

甲:你是小王?
乙:是的,我是小王,你是老李吗?
甲:是的我是老李

流程:主机1发送SYNseq=0,ctl=SYN(seq标记位,序列号) –>主机2收到SYN,发送SYN及ACK(确认号:收到的序列号+1)seq=0(序列号),ack=1,ctl=SYN(同步位),ACK–—>主机1收到STN及ACK,Establishedseq=1 ack=1 ctl=ACK


抓包实例

拓展:安全方向-SYN Flood(洪水)攻击是ddos的主要方式,通过僵尸网络发送大量的第一个SYN报文,并不回复第二个包。


tcp会话确认

  • 所有的包都要确认,只有第一个包是没有确认号的
  • 最终的确认号就是数据的大小
    主机1 seq=1 ack=1 |Data(9字节)–>主机2 seq=1 ack=10 |Data(20字节)“ack=10理解为‘你可以发送序列号为10的数据包了’”–>主机1 seq=10 ack=21 |Data(12字节)–>主机2 seq=21 ack=22 |Data(n字节)

确认号就是前一个包的序列号+数据

  • 不是每一个包都会确认,主机2连续发包时主机1多个包回复一个确认。

理解:乙给甲说了很多句话,甲回复乙,前几句话我都听到了,然后乙接着讲话。


抓包实例(从阿里云oss下载文件)



tcp会话的拥塞和流量控制

“你说太快了,慢点”
“你说太慢了,快点”

每个数据包有个window字段 win 窗口大小决定了在收到确认前可以发送的字节数。


抓包实例(下载文件)

实际抓包过程中发现,服务器发过来的包要远超过主机确认包中的窗口大小。


Q:why?


tcp会话的终止-四次挥手

小王:我要挂了
老李:好的,再见
老李:我也挂了
小王:好的,再见

终止位FIN,位于flages的最后一个字节
并不一定是所有的终止都有四次握手
比如我的多次尝试都没有抓到四次握手的终止会话

可以看到主机发出了带FIN的包,服务器确认了上一个包并带了FIN标识,主机确认了这个包后连接被关闭。

另外,我在抓包时发现了另外一个现象:

可以看到服务器发出一个带有FIN标识的包后主机先返回了一个确认包,又连续的发出了一个带有急迫标识的包与一个带有重置标识的包,服务器返回了重置的包,连接重新建立。

UDP

UDP是一种面向无连接的传输层协议,传输可靠性没有保证
udp不提供重传记住,占用资源小,处理效率高
一些时延敏感的流量,如语音、视频、游戏等,通常使用udp作为传输层协议
eg:看视频卡顿,失真,玩游戏卡顿

总结对比

传输控制协议(TCP) 用户数据协议(UDP)
面向连接 无连接
可靠传输 尽力而为的传输
支持流控及窗口机制 无流控及窗口机制
HTTP、FTP等 TFTP、DNS、DHCP等