认识端口
- 使用端口(Port)来标记不同的网络进程
- 端口(Port)使用16比特位表示(0~2^16即65535)
- 知名端口:0~1023
- 并不是说非知名端囗的就可以随意去使用了,常用软件在使用的端口如下:
网络数据在传输过程当中的五元组信息,任何一个需要在网络当中传输的数据,都会具备五元组信息,否则网络就不会给转发——{源端口,目的端口,源ip,目的ip,协议}
UDP协议
1. 关于UDP协议的三大特点——无连接,不可靠,面向数据报
无连接:是指在给对方发送消息的时候,不需要建立连接,只要知道对方的ip地址以及侦听端口就可以直接发送了
不可靠:对于udp消息的发送方,是不关心消息接收方是否工作正常;对于发送方而言,只关心发送函数(sendto)调用是否成功
面向数据报:需要结合udp缓冲区来分析,分为发送和接收。
应用层给传输层的udp协议提交数据的时候,应用层的数据会被临时写到udp协议的发送缓冲区当中,此时,在缓冲区当中打上udp协议的报头之后,就递交给网络层udp协议在接收到udp数据之后,是整条整条的给应用层进行传递
关于UDP缓冲区:
1. UDP缓冲区是整条数据接受和发送的
2. 对于UDP的发送而言,是有UDP的发送缓冲区的,只不过在发送区打上UDP协议的报头之后就直接提交给网络层了
3. 对于UDP的接收而言,是有UDP的接收缓冲区的,只不过是整条UDP数据提交给应用层的,UDP是不保证UDP数据包是可靠并且有序到达对端的
也可以再加上一个特点——UDP首部开销很小(总共八个字节),具体见下。
2.UDP协议报头字段的含义
struct udphdr
{
u_int16_t uh_sport;/*source port*/源端口
u_int16_t uh_dport;/*destination port*/目的端口
u_int16_t uh_ulen;/*udp length*/udp数据长度
u_int16_t uh_sum;/*udp checksum*/校验和
};
UDP数据长度
数据长度:类型是u_int16_t,范围是65535,udp数据报长度最大是65535字节,udp数据长度=udp头部(8字节)+应用层递交数据的长度。
引申出来一个问题:
如果应用层提交给传输层udp协议的数据超过65535字节,应该怎么办?当然udp协议的最大长度是不变的,如果要传输一个超过udp最大长度的数据,应该怎么办?
在应用层自定制协议,将数据在应用层分割成为满足udp传输的小块,在使用udp协议进行传输。有带来一个新的问题,udp协议是面向数据报,也就是意味着udp是整条数据收发的,如何在接收方的应用层表示若干个udp数据是一个应用层数据包?
设计应用层协议(自定制协议字段)字段:
1.属于同一个应用层数据,不同的数据块具有相同的id(也就是之前的被分割了)
2.在报头当中加上偏移量,偏移量是描述分块数据在整个应用层数据包当中的位置
3.分块数据长度
UDP校验和
本质上,是接收方用来校验udp数据在传输过程当中是否失真。
结果:
1.1
udp数据失真:发送方发送的udp数据和接收方接收到的udp数据不一致
处理:接收方的传输层,就不会将失真的数据提交给应用层,直接丢弃了
1.2udp数据没有失真,直接提交给应用层
校验和的计算方式
如何计算(发送方)
1.将udp数据(udp协议头+有效数据),分成多个16个比特位的小段,除了校验和的16个比特位之外,其余的比特位进行相加操作
2.求的结果进行反码运算
3.将反码运算的结果放到16个比特位的校验和当中
如何校验(接收方)
将所有的16个比特位的小段全部加起来,如果是全1,则表示数据是正常的,示例如下:
UDP的应用
- DHCP协议:动态主机分配协议,直白点:就是谁上网给谁分配ip,不上网就不分配ip
- 本质上:还是由于ipv4版本的ip地址枯竭的问题,不够用;
- 可以不可以使用ip作为一台机器的唯一标识??MAC地址是可以的(本质上是由于MAC地址是全球唯一的)
2. DNS协议:域名解析协议
作用就是将域名转化成为ip地址,而使用的协议就是udp协议;
也就是说应用层协议用到DHCP和DNS协议的时候,传输层应用udp协议。