TCP/IP illustrated 阅读笔记(四) UDP协议和IP分段
2016-01-17 21:56
831 查看
1. 什么是UDP协议
UDP协议,user datagram Protocal,是一个简单的、面向datagram的传输层协议,特点:可以保存消息边界(message boundaries),没有错误纠正、有序送达、重复包消除、流量控制、拥塞控制。所以说他简单啊。。。。。
2. UDP的Header:
UDP的首部非常简单,总共8个字节
Source Port 与 Destination Port:
各16bit,源端口和目的端口,这里的端口是逻辑上的,是为了对IP地址进行复用。不同传输层协议可以使用同一个端口(前提是设置了端口共享),并且相互没什么影响
Length:
标识UDP包的字节数(含首部和Payload),最小为8,即只有一个首部,没有用户数据.这个字段实际上是冗余的,因为IP首部的IHL减去IP首部长度即可得到该值,所以这个域的值必须和IP首部的值相对应,不然就是出错了
Checksum:
UDP的校验和计算参数包括UDP首部、payload,和源IP,目的IP,具体情况下面说,这个一般是发送者计算,接受者验证,但是当NAT机制存在的时候,因为NAT会修改源IP源端口号,所以UDP的校验和此时需要重新计算。
3.UDP Checksum
下图是常说的UDP伪首部最后的Pad Byte是虚拟的全为0的域,因为UDP使用的Internet Checksum算法使用16bit作为基本计算单元,所以这里必须要对齐到16bit。
UDP length出现了两次,不清楚为何。
如果Checksum为0x0000 ,标识没有进行校验和计算,如果正常计算校验和的值为0x0000时,那么存储为0x1111。,不过书中没有明确说第一种情况的0x0000会不会存储为0x1111,我觉的是不会的,不然就没法区分了嘛
4. IP分段(fragmentation)
IP要分段,主要是因为数据链路层有MTU限制(最大传输单元,即最大的PDU,不含当前层的首部),以太网的MTU一般为1500bytes。分段可能发生在发送者、也可能发生在发送途中的路由器,但是reassembly只可能发生接受者。因为不同的IP分段走的路线可能不一样,所以想中途进行组装是基本不可能的。分段是发生在IP层的,当最终的包(IP包)超过了数据链路层的MTU时,IP就会自动进行分段,IP分段时,payload是作为一个整体的,假设是IP里面的是UDP包,那么这么UDP的首部只会出现在第一个IP分段中,后面的IP分段没有UDP的首部
IP分段相关的几个IP域:
Identification:
因为一个IP包被分成了很多份,所以用这个域(id)来标识一个IP包,所以一个IP的不同分段的Identification域的值是一样的,不然接收端就没法知道哪个包和哪个包是一起的了
Fragment Offset:
用于标识不同分段数据的相对于首部的偏移,其实就是标识当前分段的用户数据的第一个字节在原始包中的位置,还是为了最后reassembly服务的,这个域的单位大小是8bytes,即如果是n,那么偏移位置就是8*n bytes。第一个分段值为0,因为偏移量为0。接收端可以根据最后一个包的偏移量加上最后一个包的长度计算出总包的长度
Flags:
总共3bit
bit 0: Reserved; must be zero.
bit 1: Don't Fragment (DF) ,即告诉路上的路由器不要对我进行分片,那么路由器该怎么办呢,不分片就不能传输了,所以就丢掉,路由器表示怪我喽
bit 2: More Fragments (MF),为1表示我后面还有分段,为0表示爹是最后一个分段了,
接收端收到IP分段后都会有计时器,如果到时间了,还有分段没有到达就不再等待,丢掉已经接收到的分段
5.UDP编程时绑定的地址
UDP发送包时会需要绑定本地IP,本地端口,端口没什么好说的,但是绑定IP时,因为一个主机可能有多个IP,这里就相当于选择用哪个IP发送UDP接受包时需要监听端口,所以也需要绑定本地IP,绑定本地端口。但是就是多IP地址,他们的端口池是同一个,因为是同一个主机嘛。端口还是没什么好说的。绑定IP时如果你绑定某个特定的IP地址,那么发送给其他本机其他IP地址的包你是收不到的,如果绑定的是通配IP地址(如0.0.0.0,表示所有IP),那么发送给本机任意IP地址的包你都是可以收到的,其他的变长通配符不太清楚,目前只知道0.0.0.0标识所有IP,也许是末尾为0的部分标识通配吧
接受包是还可以限制发送者的(IP,端口),看书中的意思是必须同时限制IP和端口。当然也可以一个都不限制。好像没看到只限定IP或者端口的内容
相关文章推荐
- Recognizing and Localizing Endangered Right Whales with Extremely Deep Neural Networks
- httplook设置 解决各种自身带来的问题
- c#网络相关
- 对系统网络请求进行简单封装
- Java HttpURLConnection 以数据流写数据到Servlet
- HttpClient第二章 链接管理
- Linux虚拟机启动级别和网络设置
- BZOJ-1834 网络扩容 最小费用最大流+最大流+乱搞
- BZOJ-1834 网络扩容 最小费用最大流+最大流+乱搞
- 【转】CentOS 7.0系统安装配置图解教程 | 系统运维(除了网络)
- 从网络Url中下载文件到本地
- android网络编程 二(Apache HttpClient)
- android网络编程 一(HttpURLConnection)
- Android中的Http通信(四)之多线程下载数据
- TCP协议中的三次握手和四次挥手
- TCP三次握手的理解
- TCP的流量控制和拥塞控制
- httpclient,socket
- iOS9https设置info.plist
- CentOS网络配置详解