3장 정리

2020. 10. 25. 05:05컴퓨터 네트워크

3.1 Transport-layer services

 

transport: process사이 logical communication 제공

 

send side: app message를 쪼개서 segment로 만들고 network 계층으로 전달

receive side: segment를 모아서 다시 메시지로 만들고 application 층으로 전달

 

network layer는 end host간에 데이터를 전달해주고 transport는 process 간에 데이터를 전달해줍니다. 

 

네트워크는 IP가 돌고 있고 이는 최선의 네트워크를 제공하지만 보장은 못해줍니다.

 

TCP는 Transmission Control protocol의 약어이고 UDP는 User Datagram Protocol의 약어입니다.

 

TCP는 Connection-oriented(데이터 보내기 전에 미리 설정)지만 UDP는 connectionless하고

TCP는 신뢰도 있고 순서대로 보내고 congestion과 flow를 control하지만 UDP는 그런 거 없고 IP에 추가적인 걸 하지 않습니다.

 

TCP와 UDP는 둘 다 Multiplexing, demultiplexing을 하고 둘다 지연을 보장해주지 않으며 bandwidth도 보장해주지 않습니다.

 

3.2 Multiplexing and demultiplexing

많은 application들은 단일 transport layer protocol을 사용합니다. 

sender 쪽에서는 multiplexing, receiver 쪽에서는 demultiplexing을 합니다.

 

네트워크 층에는 IP 말고도 좌우에 2개씩 있는데 좌측에는 전송층과 관련된 일을, 우측에는 데이터링크와 관련된 일을 합니다.

 

demultiplexing을 할 때 목적지 host는 반드시 받은 segment를 대상 application process로 전달을 해야합니다.

각각의 segment는 source와 목적지 port number가 있습니다.

 

client에서는 transport layer software가 port number을 사용자가 지정하지 않고 OS에서 random하게 할당합니다. 사용자가 굳이 알 필요가 없습니다. 이를 ephemeral port number이라고 합니다.

 

서버에서는 well-known port number을 사용합니다.

 

port는 well-known port number, registered port number, dynamic(private) port number로 나뉘고 well-known만 IANA에서 관리합니다. registered port number은 등록은 할 수 있지만 관리는 안합니다.

 

TCP socket은 보낸 쪽 IP 주소와 port number + 목적지 IP 주소와 port number 총 4개로 구성

UDP socket은 자기 자신 쪽 IP주소와 port number, 총 2개로 구성

 

어떤 host가 UDP segment를 받으면 destination port number만 체크, 그 port number을 가지고 있는 port에 UDP segment 전달

 

어떤 host가 TCP segment를 받으면 자기쪽 port number와 보낸 쪽 port number을 다 체크

 

3.3 Connectionless transport: UDP

 

UDP는 User Datagram Protocol의 약어로 간단하고 connectionless합니다. handshaking이 없고 각각의 UDP segment는 독립적으로 조절됩니다.

 

UDP는 checksum을 가지고 있는데 이는 에러를 체크할 수 있지만 처리할 수는 없습니다. 

 

UDP는 streaming을 할 때 썼는데 만약 신뢰성이 필요하면 UDP에 추가를 합니다. 

 

UDP는 라우팅에 관련된 정보를 인접한 라우터에 보내는데 쓰이는 RIP(Routing Information protocol), DNS, 네트워크를 관리를 하는데 쓰이는 SNMP(Simple Network Manage Protocol)에 쓰입니다.

 

UDP의 Total length는 헤더와 데이터를 합한 것으로 PDU가 됩니다. 이 헤더에는 소스의 port number, 목적지의 port number, Total length, checksum으로 이루어져 있습니다. 각각 16비트로 되어있습니다.

 

checksum은 header와 data와 pseudo-header의 에러를 체크합니다. 현재 인터넷은 option입니다. 

 

UDP pseudo header는 32bit의 source IP 주소, 32bit의 목적지 IP 주소 8비트 프로토콜 그리고 0으로 채워진 공간과 8비트 프로토콜, 16비트의 UDP total length로 이뤄져있습니다. 

 

checksum은 1의 보수법을 이용하여 계산을 하고 결과를 보여줍니다. 모두가 1이 되었을 때 에러가 없는 것입니다. 예를 들면 16비트 source source port number가 1087이고 16비트 목적지 port number가 13이면 이를 이진수 덧셈을 하고 나온 결과에 1의 보수법(0과 1을 반대로)을 적용시킨 값이 바로 checksum이 됩니다.

 

3.4 Principles of reliable data transfer (ARQ)

 

신뢰할 수 있는 데이터를 전송하는 방법은 FEC(Forward Error Correction)와 Retransmission이 있습니다.

 

FEC는 redundant한 bit를 추가로 보내서 에러를 체크하는 방법이고 대표적으로 repetition code가 있는데 그 예로 1을 보낼때 111, 0을 보낼 때 000이라는 값을 보낸다고 합니다. 만약 101이라는 값을 받았다고 하면 111 또는 000이 아니므로 에러가 났음을 알 수 있고 확률적으로 1을 보냈을 확률이 더 높습니다. 그 이유는 확률을 p라고 했을 경우 1을 보냈을 확률이 (1-p)^2*p이고 0을 보냈을 확률은 p^2*(1-p)이며 p는 10^(-2)정도의 적은 값을 가지기 때문입니다.

 

Retransmission은 재전송인데 받는 쪽은 에러를 측정할 수 있고 재전송을 요청을 합니다. 이를 ARQ라고 하는데 ARQ, Go back N, Selective repeat가 있습니다. 

 

Stop & wait는 packet을 받으면 잘 받았다는 뜻으로 Ack을 보내는데 Ack을 받을 때까지 기다리는 것입니다. 구현하기는 쉬운데 propagation delay가 큽니다. 문제는 보낸 packet과 ack이 도착을 못하면 무한정 기다리게 됩니다. 

 

그래서 Time-out이 있는데 이는 어느 시간을 두고 오지 않으면 그 시간이 지날 때 다시 보내는 것입니다. 

 

문제는 동일한 데이터를 받았을 경우입니다. 이 중복된 것을 체크하기 위해 packet에 번호를 붙입니다. 이를 sequence 번호라고 합니다. 그리고 time-out 다음에 왔을 경우도 문제라고 볼 수 있습니다.

 

예를 한번 보겠습니다. 0번을 보냈고 이에 대한 ack을 보냈는데 이 ack이 time-out을 넘어서 도착을 했다고 합시다. 그러면 다시 0번을 보낼텐데 이는 discard, 즉 무시를 하게 됩니다. 그리고 이 discard된 것에 대한 ack을 보내는 중간에 아까 time-out을 넘어서 온 0번에 대해 1번을 보낼 때, 1번이 중간에 loss가 되었다고 가정합니다. 그러면 discard된 것에 대한 ack이 도착이 되었고 다시 또 다른 값을 0번으로 지정해서 보냅니다. 그 이유는 sequence번호를 0,1,0,1로 하기 때문입니다. 그렇게 될 경우 1번이 중간에 loss가 발생했으므로 1번을 안보내고 또 똑같은 0을 보냈다고 생각하여 무시를 하게 됩니다. 

 

결국 위의 예시에서 2번째로 보낸 0과 첫 번째로 보낸 1은 영영 사라지는 것입니다. 그렇다면 중복된 것에 대해서 ack을 안보낼 때는 어떻게 될까요? 만약 0번을 보내고 이에 대한 ack을 보냈는데 이 ack이 loss가 되면 다시 0번을 보낼 것입니다. 그러나 이는 중복되었으므로 discard하고 ack을 보내지 않을 것이므로 계속 0번을 보내게 되는 일이 발생할 것입니다. 

 

그래서 해결책은 ack에도 sequence 번호를 붙이는 것입니다. sequence 번호는 header쪽의 bit를 차지하게 되고 이 bit수를 1만큼 차지하게 합니다.

 

Ack을 보내는 방법은 0번에 대한 ack을 보낼 때 Ack(0), Ack(1)로 보낼 수 있는데 0번에 대해 받았다는 뜻과 1번을 받아야한다는 뜻입니다.

 

Stop-and-wait의 성능은 다음과 같습니다.

cycle length = 2*propagation_delay + (Packet size + ACK size)/Bandwidth

Efficiency = Packet size /( packet size + ACK size + 2 * Bandwidth * propagation delay)

 

Go-Back-N, selective repeat방식은 pipelining, 즉 sliding window protocol을 씁니다. 이는 ack이 오지 않더라도 동시에 보내는 것입니다. 이로써 효율을 높입니다.

 

예를 들면 동시에 3개를 보냈을 경우 효율은 다음과 같아집니다.

 

Utilization = (3 * packet_size / propagation_delay) / (한 packet과 다음 packet 사이 걸리는 시간 + (packet_size/propation_delay))

 

Go-back_N은 보내는 쪽의 window size가 N이 되는데 이는 ack이 오지 않더라도 N개를 보낸다는 뜻입니다. sender쪽에서는 sequence 번호가 send_base+N-1보다 작거나 같은 packet들만 전송할 수 있습니다. N개까지는 ack 없이 보낼 수 있습니다. send_base는 packet의 타이머라고 생각할 수 있으며 send_base 이전까지 packet을 측정할 수 있습니다. 만약에 특정 packet에 대한 ack이 오기 전에 time-out이 걸리면 sender쪽에서는 이미 보냈던 data를 싹 다 재전송합니다. send_base부터 다음 sequence번호까지 다 재전송합니다.

 

받는 쪽의 window size는 1입니다. 만약에 받는 쪽에서 연속적으로 도착을 하면 한번만 ack를 보내주는데 여기서 ack는 순서대로 도착한 것 중에서 가장 높은 것의 ack을 보내는데 이를 Cumulative Ack 즉 누적 ACK이라고 합니다. 

 

만약 보내는데 하나가 loss가 된다고 할 때 해당 loss 된 것도 받았다고 생각을 합니다. 효율이 높아지죠. 만약 11번을 기다리고 있는데 11번이 오지 않으면 무조건 버립니다. 그리고 ack(10)을 보냅니다. 그러면 ack(10)이 중복이 될 수 있습니다. Expected Sequence number만 있으면 다 할 수 있습니다. 

 

정리하면 만약 loss된 것이 있다면 해당 번호의 time-out이 지난 후에 해당 번호 다음 것부터 다시 싹다 재전송을 합니다.

 

만약 sender window size(sws)를 4로 하고 sequence number 비트 수를 2bit로 할 경우를 생각해봅시다. packet들은 다 도착을 했는데 ack들이 다 loss가 될 경우 sender는 0번부터 3번까지 재전송을 합니다. 그러나 이것들은 이미 받은 data기 때문에 error가 발생합니다. 그래서 SWS는 2^(sequence number bit 수)-1보다 작거나 같아야 합니다. 

 

Selective Repeat는 sender window size와 receiver window size가 N입니다. sender는 go-back-n과 하는 일이 같습니다. 대신 time-out이 걸릴 경우 time-out이 걸린 것만 재전송을 합니다. receiver 쪽에서는 도착하는 순서가 달라도 RWS에 포함이 되어있다면 저장을 합니다. 대신 순서에 맞지 않는 것들을 buffer에 넣어두고 필요한 것이 도착하면 그것을 합쳐서 상위 layer로 보냅니다. 여기서 ack는 해당 packet에 대해서 받았다는 의미입니다. cumulative ack이 아닙니다.

 

 

 

 

'컴퓨터 네트워크' 카테고리의 다른 글

2장 요약  (0) 2020.10.25
1장 정리  (0) 2020.10.25
3장 1~3 요약(미완성)  (0) 2020.10.21
2-6 비디오 스트리밍과 CDN 요약  (0) 2020.10.21
Chapter 2.1 Principles of network applications  (0) 2020.09.26