본문 바로가기

네트워크/chapter 3. 트랜스포트 계층

3장 문제

R1

...?

 

R4

TCP에 비해, UDP가 가지는 장점들

1. 혼잡제어를 하지 않으므로, 애플리케이션 프로세스가 데이터를 UDP에 전달하자마자, UDP는 데이터를 UDP 세그먼트로 만들고, 그 즉시 네트워크 계층으로 전달한다. 즉, 세그먼트가 생성된 후 네트워크 계층으로 전달되기까지의 지연이 없다.

 

이것은, 지나치게 지연되는 세그먼트의 전송을 방지하므로, 최소 전송률을 보장하기를 바라는 애플리케이션에 사용될 수 있다.

 

2. 3-way handshake를 하지 않으므로, 빠르게 동작한다

 

3. 신뢰적인 데이터 전송 / 혼잡제어 를 하지 않으므로, 연결 설정 자체를 유지할 필요가 없다. 즉, 하나의 애플리케이션이 UDP로 동작한다면, 더 많은 클라이언트를 수용할 수 있다.

 

4. 작은 패킷 헤더 오버헤드

TCP : 20bytes

UDP : 8bytes

 

R6

불가능하다...?

 

 

R8 

비지속 / 지속 연결 = HTTP의 특성.

즉, 현재 HTTP의 지속 연결로 통신하고 있음을 뜻한다.

(추가로, HTTP는 TCP 프로토콜을 사용한다)

 

웹 서버가 80번 포트(웰컴 소켓의 포트)로 요청을 받으면, 요청 시 새로운 연결 소켓이 생성된다.

(참고 : 웰컴 소켓은 하나의 프로세스에 유일하게 1개만 존재.

따라서, 연결을 맺고자 처음 요청이 들어올 때(아직 TCP 연결 된 것이 아님)는 전부 다 웰컴 소켓으로 들어온다.

그 후, 각기 다른 연결 소켓이 생성되는 것.)

 

이때, 지속 연결이므로 같은 호스트에서 오는 요청에 대해서는, 해당 호스트가 요청했을 때 만들어두었던 연결 소켓을 통해 통신된다.

하지만, 다른 호스트에서 오는 요청은 새로운 요청이므로, 새로운 연결 소켓이 별개로 생성된다.

(TCP 소켓의 식별자 = 출발지 IP주소, 출발지 포트 번호, 목적지 IP주소, 목적지 포트 번호 이므로, 새로운 호스트에서 요청한다면 새로운 연결 소켓이 생성되는 것이다.)

 

그러므로,

다른 두 호스트에서 오는 요청은 각기 다른 소켓으로 받아진다.

두 소켓은 모두 다른 포트 번호를 가진다(80번 포트는 웰컴 소켓의 포트 번호이고, 요청을 받는 소켓은 연결 소켓임을 명심하자!!)

(이게 정확히 맞을까요..?)

 

[참고]

UDP 소켓의 식별자 = 목적지 IP주소, 목적지 포트 번호

TCP 소켓의 식별자 = 출발지 IP주소, 출발지 포트 번호, 목적지 IP주소, 목적지 포트 번호

 

# p.182, 183 (웹서버와 TCP)

 

 

R9

송신자 입장에서, 패킷이 잘 수신되었는지 아닌지를 판별하기 위해서 ACK, NAK 패킷을 받아야 한다. 이때, ACK, NAK 패킷이 손상되거나 손실될 수 있는데, 이때 송신자는 데이터를 재전송 해야한다.

 

수신자 입장에서는 데이터가 재전송인지, 처음 보내는 데이터인지 구별할 수가 없으므로, 순서번호를 통해 이전에 받았던 패킷인지 새로 받는 패킷인지 구별할 수 있게 된다.

 

# p.195

 

R10

송신자 입장에서 "패킷 손실이 일어났음을 어떻게 판별할 것인가?" 에서 시작되었다.

패킷 손실이 일어났다고 판단되면, 송신자가 패킷을 재전송함으로써 손실된 패킷의 검출 및 회복을 동시에 진행하게 되는 것이기 때문이다.

 

따라서 패킷 손실이 일어났음을 판단하기 위해 타이머가 도입되었다.

 

# p.198,199

 

R11

타이머가 필요 없다.

 

타이머의 역할 자체가, ACK가 손실되었을 경우에 송신자가 계속 대기할 수 없기 때문에 생겨난 것이다.

 

따라서, 송신자가 ACK가 일정 시간 뒤에 도착한다는 사실을 이미 알고 있다면, 이 시간 자체가 타이머와 같은 역할을 하기 때문에, 타이머가 필요없게 된다.

 

R14

a. x

- B에서 A로 보낼 데이터가 없더라도, 피기백을 보내주어야 한다. 확인응답을 보내지 않으면, B가 받을 수 있는 공간이 있음에도 불구하고 A -> B로 데이터 전송 시도 자체가 일어나지 않기 때문이다 (p.232, 233)

 

b. x

- 변한다. rwnd는 수신 버퍼의 여유 공간을 의미하는데, 수신 애플리케이션이 시간 나는 대로 수신 버퍼에서 데이터를 가져가고, 송신 애플리케이션이 데이터를 보내므로, rwnd는 동적일 수 밖에 없다

 

c. o

- "A가 보내는 확인응답 안 된 바이트 수"는 조금 더 자세히 말하면, "이미 전송하였지만 확인응답 안 된 바이트 수"이다. 즉 현재 수신 버퍼로 넘어가고 있거나 넘어간 데이터들을 의미하는데, 이 크기가 수신 버퍼보다 크다면 오버플로우가 발생하기 때문에, A가 보내는 확인응답 안 된 바이트 수는 수신사 버퍼의 크기를 초과할 수 없다.

 

d. x

- 순서번호는 세그먼트에 대한 순서가 아니다. 바이트에 대한 순서번호이다. 즉, 세그먼트가 8바이트이고 첫번째 순서번호가 m에서 시작한다면, 그 다음 세그먼트의 순서번호는 m+8이어야 한다. 

 

e. o

- TCP 세그먼트의 헤더의 '수신 윈도우' 필드에 rwnd의 값을 설정한다. 따라서, 헤더에 rwnd 값을 설정하는 것이 맞다

 

f. x

- 전혀 관련이 없다. Estimate RTT로 타임인터벌을 만들기 때문이다

 

g. x

- 수신자가 받아야하는 올바른 순서번호를 가진 세그먼트가 전달되었다면, 순서번호 38에 4바이트 크기의 세그먼트 데이터에 대한 확인응답 번호가 42이다.

하지만, 올바른 순서번호를 가진 세그먼트가 아니라면, 현재 수신자가 받아야 하는 순서번호를 확인응답 번호로 하여 확인응답을 보낸다.

 

 

R15

a. 110 - 90 = 20bytes

b. 결국, 첫번째 세그먼트를 받아야 하기 때문에 (두번째 세그먼트를 받은 것과 상관 없이) 응답번호는 90번이다.

 

 

R16

텔넷을 이용해 'C'에 대한 통신의 마지막은, A가 ACK로 seq = 43, ack = 80을 보내는 것으로 끝났다. 그 이후에 'R'을 보내는 상황은 다음과 같다. ( 순서번호 시작이 43부터임으로, 그림 주의해서 볼 것. 44가 아니라 43이다...)

 

P6

0. 송신자 현재 상태

상위로부터 0번 호출을 기다림

 

0. 수신자 현재 상태

하위로부터 0번 호출을 기다림

 

1. 송신자 측 상황

- 이벤트 : 상위로부터 데이터 받음

- 행동 : seq 0번(순서번호 0번) 패킷을 만들고, 보내기

- 상태 전환 :  0에 대한 ASK or NAK 응답을 기다림

 

2. 수신자 측 상황

- 이벤트 : 패킷을 받고, 손상되지 않았고, seq 0번 패킷을 받음

- 행동 : 데이터 상위로 전달, ACK 패킷 만들기, 보내기

- 상태 전환 : 하위로부터 1번 호출을 기다림

 

이 상황에서, ACK가 손상되어 전달되었다고 가정하자.

그렇다면, 수신자는 손상된 ACK를 받게 된다. 그 상황부터 상황을 전개해나가보자.

 

3. 송신자 측 상황

- 이벤트 : 손상된 패킷을 받음

- 행동 : seq 0번 패킷을 다시 전달한다

- 상태전환 : 그대로 유지(=0에 대한 ASK or NAK 응답을 기다림)

 

4. 수신자 측 상황

- 이벤트 : 패킷을 받고, seq 0번 패킷을 받음

- 행동 : NAK 패킷 만들고, 보내기

- 상태전환 : 그대로 유지(하위로부터 1번 호출을 기다림)

 

이렇게 3번과 4번 상황이 무한히 반복되면서, 송신자와 수신자는 교착 상태에 빠지게 된다.

 

# p.196

P7

송신자 입장에서 ACK는 가장 최근에 보낸 데이터 패킷에 대한 ACK임을 알기에, 굳이 번호가 필요하지 않다. 

 

# p.195

P10 

최대지연시간보다 약간 더 큰 타이머를 추가하여 프로토콜을 수정한다.

즉, ACK, NAK을 기다리는 상태에, 시간 초과 이벤트를 추가하는 것이다.

시간초과 이벤트가 발생하면, 송신자는 가장 최근에 전송된 패킷을 다시 전송하게 된다.

 

따라서, (1) 송신자가 보내는 데이터 패킷이 손실되는 경우와 (2) ACK가 손실되는 경우 둘 다 다음과 같이 진행된다.

- 타임아웃이 발생하여, 데이터 패킷이 전달된다.

- 이때, 수신자 입장에서는 재전송인지, 원래 전송 방식인지 구별하지 못하므로 rdt2.1은 정상동작을 할 수 있다.

 

 

P11

0번 호출을 기다리는 중인 송신자가 [1. 손상된 패킷 or 2. 1번 패킷] 을 받는다면 아무런 동작을 하지 않게 된다.

수신자는 현재 ACK를 기다리고 있는 상황인데, 송신자는 아무런 행동도 하지 않으므로, 교착상태에 빠지게 된다.

(반대 상황은 마찬가지이므로 생략)

 

 

P15

d(trans) = L/R = 1500*8 bits / 10^9 = 0.000012s = 0.012msec

RTT = 15msec

 

따라서, 비트 전송 시 걸린 전체 시간은 30.012 msec

 

N을 윈도우 크기라고 하면,

그럼, 0.012/30.012 * N >= 0.97 이어야 하므로,

N >= (0.97 * 30.012) / 0.012

N >= 2425.97

 

따라서, 최소 윈도우의 크기 N은 2426이 되어야 한다