负责两端数据传输
端口号是定位主机进程,tcp和udp协议中包含了端口,这才是能传输数据的原因
UDP缓冲区中,数据是带报头的,上层要读数据,是需要先解析报头,看这条数据多大,再在缓冲区中取对应报头的数据
TCP缓冲区中,数据是不带报头的,上层直接取
UDP协议格式:
一个UDP报文,包括UDP在内,最大必须是64k,应用层sento发送数据的时候,最大数据长度是64-8k
检验和:接收的数据和发送的数据是否一致,宁愿不处理,也不处理错的
检验算法:二进制反码求和
发送方发送数据时,将检验和置0,从报头开始,逐字节取反相加,直到数据报尾,高出16位的部分阶段与低16位继续相加,得到一个检验和,填充到检验和字段中,发送
粘包:多条数据当作一条数据处理,通过16位数据报长度解决
UDP协议特性
- 无连接:相对TCP来说,通信前不用建立连接,只要知道对方地址信息就行
- 不可靠:传输过程中不保证数据不丢包,有序(后发的先到)到达对端
- 面向数据报传输:传输数据最大大小限制是(64-8k),接收端向上交付数据时必须整条交付(UDP数据放到缓冲区是有报头的,每次取时先取8字节报头,再取剩下数据)
UDP协议特性对编程的影响
- 影响1:UDP不保证数据有序到达对端(网络拥塞了,后发的数据找别的路提前到了对端),需要程序员在应用层进行包序管理
- 影响2:如果对可靠有要求,还要进程丢包检测和重传机制
- 影响3:UDP传输的报文有最大大小限制,所以程序员发送数据时一次不能发送太多,必须在应用层进行分包处理
UDP传输是整条交付,不会交付半条或多条数据,在应用层接收数据时,缓冲区必须定义的足够大,才能保证获取一条完整的数据
应用层产生比2^16还要大的数据
1.将分包的数据在应用层进行描述,定义一个包头
- 标识:同一个udp数据报具有相同的标识符
- 标志位:标识分片的udp数据后还有没有分片;
为1表示还是还要1个分片片偏移,标识分片在整个udp数据包中的位置,表示是整个数据中第几个字节
2.然后将每个包头+数据包进行传输
3.当应用层接收到数据,识别到有自定义包头,则将该段数据保存在应用层,查看包头来寻找下一段数据
UDP支持局域网广播
udp缓冲区
- 发送缓冲区:将应用层提交给传输层的应用层数据打上udp包头后,提交给网络层继续传输;
- 接收缓冲区:去掉udp包头后,将数据递交给应用层;udp不保证数据的可靠和有序;
TCP协议格式
标志位换成请求
MTU的大小一般是1500字节
在传输层只关心端与端传输,udp和tcp协议都不涉及源ip和目的ip
- 32位序号:TCP是面向字节流的,相当于对每个字节都进行了编号,序号的作用就是双方辨别有没有序,有没有丢包
- 32位确认序号:接收方接收到数据后,就会给发送方发送一个确认报文(包含确认序号)
确认序号告诉对方多少号以前的数据已经收到了(快重传,滑动窗口机制)
第二条数据的确认回复丢了,但是收到第三条数据的确认回复,则发送端就认为第二条数据也收到了- 4位头部长度:以4字节为单位,描述TCP报文头部长度(4位数据的最大值是15)
报头最大长度是60字节,最小20字节
解析过程:所以在解析的时候先取出20字节固定长度,再根据头部长度,再取出剩余多少报头长度
TCP报头长度不固定,不管咋变前20字节固定,只有选项数据存在不定长度- 6位保留:暂未使用
- 6位标志位
选项:0-40字节选项数据(不一定有)- 滑动窗口:用于实现滑动窗口机制进行流量控制
防止数据发送太多,接收方没接收到而丢弃,告诉发送方接收缓冲区还剩多少空间,满了就不要发了
TCP协议特性
面向连接,可靠传输,面向字节流传输
快重传
因为网络原因后发数据先到,不能保证前面数据是丢了还是正在传输中
后发的数据回复时,ACK=1(也叫重传请求),表示1前的数据已经收到
但是发送方不会立即发送那条数据,需要回复三次ACK=1(重传请求)才能发送