Week - 8 : Midterm Exam

패킷의 시간초과를 검사하는 타이머이다.
RTT는 Round Trip Time으로 실제 측정 시간이다.
그림에서 RTO는 RTTs + (4 * RTTd)로 설명한다.
RTTs는 가중 이동평균이다.

현재 측정한 RTTm을 1/8 만큼만 반영하고
이전 RTTs를 7/8 만큼 반영하면서 업데이트 하는 가중 평균 방식이다.
RTTd 는 왕복 시간편차이다.

똑같이 가중치를 이용하여 계산한다.
RTO는 넉넉하게 가중평균에 편차를 4배한 값을 더하여 설정한다.

위 그림은 계산의 예시이다.
모든 패킷에 타이머를 달지만 패킷 하나를 보내고 그 패킷이 돌아오기 전, 그 사이에 보낸 패킷은 측정에 쓰이지 않는다.
예시로 돌아가면 처음 RTO는 아무 값이나 설정한다.
RTO는 다음 RTO에 아무런 영향을 미치지 않기 때문이다.
처음 보낸 패킷에 대한 RTT 측정이 1.5초가 나왔다.
첫 측정이었기 때문에
RTTs는 1.5 그대로
RTTd는 절반인 0.75로 설정한다.
이때 RTO는 1.5 + (4 * 0.75) = 4.5가 된다.
다음 측정에서 RTTm 이 2.5초가 걸렸다.

위 그림 처럼 계산할 수 있다.

칸 알고리즘은 Sender가 왼쪽과 오른쪽의 상황을 구별할 수 없다는 문제점을 해결하기 위한 것이다.
만약 Retransmission 상황이 일어났고 ACK가 들어 온다면 이 ACK가 처음 보낸 전송에 대한 것인지, 재전송에 대한 것인지 구분 할 방법이 없다.
칸 알고리즘은 재전송이 일어나면 그에 대한 측정값을 RTO계산에 사용하지 않는다.
타임아웃이 발생하면 RTO 값을 두 배로 늘린다.

타임 아웃으로 인한 재전송 시 RTO를 두 배로 늘리는 그림이다.
다시 언급하지만 RTO는 다음 RTO 계산에 영향을 주지 않는다.
TCP Header는 기본 20바이트에 옵션으로 40바이트를 쓸 수 있다.

주요 옵션에는 7가지가 있는데
단일 바이트 옵션은 특별한 기능을 하지 않고
4바이트 정렬을 위한 패딩으로 사용된다.

MSS 옵션은 TCP의 연결 체결 과정에서만 사용되며 SYN 패킷과 같이 간다.
이것은 세그먼트의 사이즈를 재설정하는 옵션이며 연결 중에는 바꿀 수 없다.

TCP 헤더에서 Window 사이즈를 담을 수 있는 값은 16비트 였다.

만약 64KB가 부족한 상황이면 Scale Factor 옵션을 사용한다.
3을 전송하면 2^3 으로 해석하여 8만큼 곱하여서 윈도우 사이즈를 해석하자는 것이다.
이 옵션 또한 연결 수립 과정에서만 이루어질 수 있다.


타임 스탬프 옵션은 패킷의 응답에 출발 시간을 넣어주어서
Sender가 RTT 계산을 할 때 현재 시간에 타임스탬프 옵션을 빼는 방식으로 편리하게 계산할 수 있도록 해준다.
또한 PAWS를 위해서도 쓰이는데 Protection Against Wrapped Sequence number는 보내는 데이터가 너무 많아서
Seq 번호에 중복이 발생 했을 시 구분을 위해서도 쓰인다는 말이다.

SACK 옵션은 통신 중 Out of Order 패킷에 대한 효율적인 처리를 위해 쓰인다.

예를 들어 9000 데이터 까지 보내었는데
중간에 2001~3000, 3001~4000, 6001~7000, 7001~8000 패킷이 손실 된 상태이다.
ACK은 2001이 계속 올것이고 Sender는 이를 해결하기 위해
2001~9000까지 다시 재전송 하게 된다.
이러한 비효율을 막기 위해서 내가 받은 블럭 그룹을 알려주는 것이다.
SACK 블럭을 보면 4001-6001, 8001-9001 까지 가지고 있다는 것을 알려줄 수 있다.
이 옵션 역시 연결 수립과정에서만 설정 가능하다.
IPv4 는 32비트 주소 체계이며 약간의 예외를 제외하고는 전세계에서 unique한 값이다.
2의 32승까지 표현 가능하여 약 40억개의 주소가 존재한다.
이진법에 대해 간단히 소개하면
10진법 to 2진법 변환은 
2의 모듈러스 연산을 통해 이루어진다.
2진법을 4비트씩 끊어서 0~F로 표현한다.

앞에 0x를 붙이거나 뒤에 16을 붙여서 16진법임을 나타낸다.

NOT 연산은 비트를 반전한다.
0->1
1->0

AND 연산은 입력이 둘다 1일 때만 1을 출력한다.

OR 연산은 입력에 1이 존재하면 항상 1을 출력한다.
146.102.29.0 ~146.102.32.255 사이 몇개의 주소가 있는지는
양 끝 범위를 뺀 뒤 1을 더해주면 된다.
따라서 0.0.3.255 + 1이되며 1024가 된다.

IPv4 주소를 5개의 클래스로 나눌 수 있다.
절반을 A
나머지의 절반을 B
또 나머지의 절반을 C
그리고 남은 것을 각각 D와 E로 나눈다.

이진법으로 보면
맨 앞 비트가 0이면 A
1이라면 그 다음 비트가 0이면 B
11이라면 그다음 비트가 0이면 C
111이라면 그다음 비트가 0이면 D
1111이면 E로 분류한다.
이것은 네트워크id를 분류하기 위함이다.

만약 인하대학교에 있는 전화기들을 위해 네트워크 관리자가 860이라는 전화네트워크 국을 사왔다고 가정한다.

그렇다면 860-xxxx(0000~9999) 총 만개의 전화번호를 할당할 수 있다.
그런데 어떤 집단은 번호가 만개까지 필요가 없다면
더 적은 스코프의 국을 사용해야 한다.
클래스 A는 첫1바이트를 네트워크아이디로
B는 2바이트
C는 3바이트로 호스트 아이디의 갯수를 조절할 수 있으며
하나의 네트워크 아이디에서 사용되지 않는 호스트 아이디는 낭비되는 것이다.

Class A는 맨 앞 비트가 0이므로 나머지 7비트로 표현가능한 0~127까지 첫 바이트로 표현 가능하고
이것은 127개의 네트워크 아이디를 가지며
각 네트워크 아이디는
3바이트만큼의 호스트아이디를 쓸 수 있게 된다.