UDP协议:无连接,不可靠,面向数据报
- 无连接:通信不需要建立连接,只要知道对方的地址就可以直接传输
- 不可靠:数据丢了就不管,没有更多的处理丢包机制
- 面向数据报:无连接,不可靠,固定且有最大长度限制的传输方式
数据长度固定:udp使用sendto发送数据的时候,将数据放到socket发送缓冲区中,数据在缓冲区中不做停留,而是直接取出封装头部
数据最大长度限制:因为udp数据报长度在头部字段中进行了描述,决定了udp报文不能超过64k(包含头部) 64k-8
UDP协议格式:
- 16位源端端口号、16位对端端口号 :描述了是哪两个主机上的sock之间在进行通信
- 16位数据报长度:16位所能存储的最大数字位65535,它决定了一个完整的UDP报文最大能超过64k
- 16位校验和:采用二进制反码求和算法校验接收到的数据是否和发送的数据一致
UDP特性对程序编写的影响:
若传输的数据大小大于64k-8,sengto会直接报错,因此传输数据的时候程序员应该在应用层将数据报划分为合适的大小进行发送。因为UDP不提供可靠的有序传输,有可能因为网络问题导致数据不按顺序接收,因此需要程序员在应用层进行包序管理。
UDP是单条传输,所以接收数据时整条接收(因为头部有数据报长度,不允许接收半条或者多条数据)
TCP协议:面向连接,可靠 ,面向字节流
面向连接:在通信前必须建立连接,不通信了就断开连接 ------ tcp的连接管理
TCP的连接管理:三次握手建立连接,四次挥手断开连接,双方的状态管理
- 16位源端端口,16位对端端口,描述哪两个socket之间在进行通信
- 32位序号、32位确认序号----> 进行包序管理,接收方根据序号对数据进行排序,并且实现应答机制
- 4位头部长度:表示tcp头部有多少个32bit字(4字节),因为4位最大值是15,所以最多有15个32bit,也就是60个字节是最大的tcp头部长度,最小20字节
- 6位保留:暂时没有或者弃用
- 6位标志位 URG:紧急指针是否有效
ACK:表示确认好是否有效,携带ack标志的报文段也称确认报文段
PSH:提示接收端应用程序应该立即从tcp接受缓冲区中读走数据,为后续接收的数据让出空间
RST:表示要求对方重建连接。带RST标志的tcp报文段也叫复位报文段
SYN:表示建立一个连接,携带SYN的tcp报文段为同步报文段
FIN标志:表示告知对方本端要关闭连接了。 - 16为窗口大小:是TCP流量控制的一个手段,这里说的窗口是指接收通告窗口,它告诉对方本端的tcp接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
- 16为校验和:由发送端填充,接收端对tcp报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意这个校验不仅包括tcp头部,也包括数据部分。这也是tcp可靠传输的一个重要保障。
- 16位紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此这个字段是紧急指针相对当前序号的偏移量。不妨称之为紧急便宜,发送紧急数据时会用到这个。
- 选择数据:最后一个选项字段是可变长的可选信息,最多包含40字节的数据。典型的tcp头部选项结构: