《Rust实战》读书笔记——第9章,NTP不同角度理解同一个公式
[复制链接]
很多网络设备都需要获取网络时间进行对时调整,用的协议就是NTP。rust实现过程很简单,就是发udp,获取返回值解释、计算:
fn ntp_roundtrip(
host: &str,
port: u16,
) -> Result<NTPResult, std::io::Error> {
let destination = format!("{}:{}", host, port);
let timeout = Duration::from_secs(1);
let request = NTPMessage::client();
let mut response = NTPMessage::new();
let message = request.data;
let udp = UdpSocket::bind(LOCAL_ADDR)?;
udp.connect(&destination).expect("unable to connect");
let t1 = Utc::now();
udp.send(&message)?;
udp.set_read_timeout(Some(timeout))?;
udp.recv_from(&mut response.data)?;
let t4 = Utc::now();
let t2: DateTime<Utc> =
response
.rx_time()
.unwrap()
.into();
let t3: DateTime<Utc> =
response
.tx_time()
.unwrap()
.into();
Ok(NTPResult {
t1: t1,
t2: t2,
t3: t3,
t4: t4,
})
}
重点要理解的,是T1、T2、T3、T4的计算。根据定义:
关于这4个t的使用,有2个公式:
看上去,第一个式子除上2就是第二个,但为啥这么折腾呢?
因为含义不同,第一个式子表示的是在客户端计算的用时和在服务端计算的用时之差(上图2个灰框的差),第二个式子是发送请求用时和接收回应用时之和(上图2条红虚线箭头的和)。
|