Search

'NTP'에 해당되는 글 2건

  1. 2019.12.24 [NTP] CNtpTime, sntp.h, sntp.cpp 의 문제점 정리
  2. 2019.12.23 [CPP] NTP Sync LocalClockOffset
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

[NTP] CNtpTime, sntp.h, sntp.cpp 의 문제점 정리

 

NTP 프로토콜을 이용하여 클라이언트 시간 동기화시

 

sntp.h, sntp.cpp 로 만들어진

 

CNtpTime 클래스를 많이 사용하는것 같다.

 

ex)

 

https://github.com/hsluoyz/rmtsvc/blob/master/net4cpp21/protocol/sntpclnt.cpp

 

hsluoyz/rmtsvc

A web-based remote desktop & control service for Windows. - hsluoyz/rmtsvc

github.com

http://read.pudn.com/downloads142/sourcecode/hack/trojan/616424/sntpclient%202008-08-03/NtpTime.c__.htm

 

sntpclient.rar NtpTime.c

www.pudn.com > sntpclient.rar > NtpTime.c, change:2008-08-25,size:4890b #include "NtpTime.h" #include "datatype.h" #include #include #define FALSE 0 SYSTEMTIME st; CNtpTimePacket host2network(CNtpTimePacket ntp) //transform the host byte order to network b

read.pudn.com

https://github.com/domz1/integrity/blob/master/Source/Virtuos_v17/Build/Program/_Network/Misc/Src/Sntp.cpp

 

domz1/integrity

Contribute to domz1/integrity development by creating an account on GitHub.

github.com

 

위 코드들 모두 누군가 만든 CNtpTime 을 그대로 사용하고있는데...

 

그런데 이 클래스에 문제점이 있다.

 

 

 

CNtpTime::operator SYSTEMTIME() 

 

CNtpTime 을 SystemTime 으로 형변환 해주는 오퍼레이터 함수인데

 

 

  st.wMilliseconds = NtpFractionToMs(Fraction());

 

이 부분에 문제가 있다.

 

Fraction 을 Milliseconds 로 변경한 결과가 1000 이 되는 경우가 발생한다.

 

NtpTime 실제 값을 저장 할 시에

 

FileTime 을 사용하는데

 

FileTime 은

 

Second 와 NanoSecond 를 구분하여 16진수 기준 앞 8자리 뒤 8자리로 표현한다.

 

NanoSecond 의 값이 0x100000000 이 1Second 인데

 

NanoSecond 의 표현부는 0xFFFFFFF 이므로 1Second 도 0xFFFFFFF 로 표기된다.

 

 

 

CNtpTime::operator SYSTEMTIME() const
{
// Currently this function only operates correctly in
// the 1900- 2036 primary epoch defined by NTP
SYSTEMTIME st;
DWORD s = Seconds();
st.wSecond = (WORD)( s % 60 );
s /= 60;
st.wMinute = (WORD)( s % 60 );
s /= 60;
st.wHour = (WORD)( s % 24 );
s /= 24;
long JD = s + JAN_1ST_1900;
st.wDayOfWeek = (WORD)( ( JD + 1 ) % 7 );
GetGregorianDate( JD, st.wYear, st.wMonth, st.wDay );
st.wMilliseconds = NtpFractionToMs( Fraction() );
 
return st;
}

 

위 구조 상

 

NtpFractionToMs( Fraction() ) 의 결과값이 1000 이어도

 

Second 로의 올림이 발생하지 않아서

 

Milliseconds 가 1000 인 채로 다음 연산으로 넘어가게 된다.

 

 

Milliseconds 가 1000 인 상태에서

 

SystemTime 을 FileTime 으로 바꾸는 SystemTimeToFileTime 함수를 실행하게 되면

 

비정상값이 리턴된다.

 

 

 

 

 

[CPP] NTP Sync LocalClockOffset

Programming/C,CPP,CS 2019. 12. 23. 23:52 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

[CPP] NTP Sync LocalClockOffset

 

NTP 는

 

Network Time Protocol 으로 네트워크를 통해 시간을 동기화 하는 프로토콜입니다.

 

NTP 서버 시간에 클라이언트 시간을 맞추기 위한 프로토콜입니다.

 

 

 

[현재 시점] 서버의 현재 시간과 클라이언트의 현재 시간이 다를 수 있고,

 

[지속 되는 상태] 서버의 1초와 클라이언트의 1초가 다를 수 있습니다.

 

 

 

서버 혹은 클라이언트간 시간이 아주 중요한 프로그램에서는

 

NTP 는 한번만 수행하는 것이 아닌 지속적으로 수행하여 동기화 하게 됩니다.

 

 

 

 

 

서버와 클라이언트의 시간 차이를 LocalClockOffset 으로 표기합니다.

 

 

 

 

여러 클라이언트의 시간을

 

NTP서버와 동기화하여

 

각 클라이언트간 시간이 동기화 하도록 하기 위해 사용 되는 값이 offset 입니다.

 

 

 

계산 식은

Timestamp Name ID When Generated

------------------------------------------------------------

Originate Timestamp T1 time request sent by client      C1

Receive Timestamp T2 time request received by server  S1

Transmit Timestamp T3 time reply sent by server         S2

Destination Timestamp T4 time reply received by client C2

 

The roundtrip delay d and system clock offset t are defined as:

 

d = (T4 - T1) - (T3 - T2)

t = ((T2 - T1) + (T3 - T4)) / 2.

t = ((S1 - C1) + (S2 - C2)) / 2.

 

여기서

 

 

 

 

여기서 서버와 클라리언트가 패킷을 주고 받는데 걸리는 딜레이(delay1, delay2)는 같다고 가정한다.