-
네트워크: Transport layer 정리 (TCP/UDP, 다중화/역다중화, 신뢰적 데이터 전송의 원리(RDT))네트워크 2020. 9. 30. 13:31
< 전송계층(Transport layer)이란? >
서로 다른 호스트들의 process들은 전송계층(Transport layer)를 통해
logical한 communication을 주고 받는다.
호스트 사이에서의 통신이므로 전송계층은 end-system위에서 동작하며
segment라는 단위로 패킷을 주고 받는다.
패킷을 전송하는 send side는 message를 segment로 나누어 네트워크 계층으로 보내며
패킷을 받는 rcv side는 segment를 message로 조립하여 응용계층으로 보낸다.
< 호스트 프로세스 사이에서의 통신 >
전송계층에서 통신이 이루어지기 위해서는 크게 TCP와 UDP 프로토콜이 사용된다.
이 두가지에 대해서 자세히 알아보자
1. TCP
TCP는 신뢰성이 있는 전송계층의 통신 방법으로 다양한 일을 한다.
후에 자세히 다루겠지만, congestion control, flow control, connection setup등
다양한 방법을 이용하여 신뢰성 있는 통신을 한다.
또한 패킷을 보낸 순서대로 패킷을 받기 때문에 in-ordered한 특성을 갖는다.
2. UDP
반면, UDP는 TCP에 비해 하는 일이 없다.
그래서 UDP 통신은 신뢰성이 떨어지며 패킷 전송 중 손실이 발생하면 손실된 상태로 처리한다.
(추가적으로 application layer에서 신뢰성을 높이는 작업을 한다)
또한 in-order한 특성을 갖는 TCP와 달리 UDP는 un-ordered한 특성을 지녀
패킷을 보내는 순서를 신경쓰지 않는다.
따라서 손실이 일어나도 괜찮고 속도(rate)가 중요한 서비스에 사용된다.
예를 들자면 streaming multimedia, DNS, SNMP등과 함께 사용된다.
[UDP segment header]
하는 일이 없기 많이 없기 때문에 헤더도 간단하게 생겼다.
※ 추가사항
- connection을 할 필요가 없기 때문에 단순하고 혼잡제어를 할 필요도 없다.
- header의 사이즈가 작기 때문에 동일한 데이터를 효율적으로 보낼 수 있다.
그렇다면 전송계층에서 어떻게 패킷을 주고 받는지에 대해 더 자세히 알아보자
< Multiplexing / Demultiplexing >
운용계층으로부터 들어온 데이터는 다중화(multiplexing)을 통해 네트워크 계층으로 전송되고
네트워크 계층으로부터 들어온 데이터는 역다중화(demultiplexing)을 이용하여 운용계층으로 전송된다.
다중화, Multiplexing이란 sender가 소켓으로부터 들어온 data에 transport header를 붙여
네트워크 계층으로 전송할 수 있게 하는 과정이다.
역다중화, Demultiplexing이란 전송계층의 receiver에서 일어나며
header info를 이용하여 segment를 해당 소켓으로 보낸다.
demultiplexing은 들어온 패킷이 UDP인지 TCP인지에 따라
Connectionless demultiplexing과 Connection-oriented demultiplexing으로 나눈다.
1) Connectionless demultiplexing
들어온 패킷이 UDP 프로토콜인 경우
connectionless demultiplexing은 을 이용하여 통신한다.
UDP를 사용하므로 커넥션을 만들 필요가 없으며 목적지 포트의 소켓까지 가는데
목적지 ip address와 목적지 port number만이 사용된다.
즉, 어떤 source IP주소, source port를 갖고 있던간에
목적지 IP와 포트만 같다면 같은 소켓으로 보낸다.
2) Connection-oriented demux
들어온 패킷이 TCP 프로토콜인 경우
connection-oriented demultiplexing은 을 이용하여 통신한다.
TCP를 사용하므로 커넥션을 만들어야 하며 목적지 포트의 소켓까지 가는데
source ip address, source ip port, 목적지 ip address와 목적지 port number까지 4가지 정보가 필요하다.
(신뢰성이 필요한 통신이기 때문)
따라서 TCP 소켓은 4-tuple 데이터로 구성된다.
- source IP address
- source port number
- destination IP address
- destination port number
TCP 소켓은 동시다발적으로 많이 존재할 수 있으며 각각의 client에 대해서 다른 소켓들이 존재한다.
그렇다면 TCP는 어떻게 신뢰성있는 통신을 할까?
이에 대해 설명한 것이 RDT 모델이다.
< RDT(Reliable data transfer) 의 원리 >
전송 계층에서는 TCP를 이용하여 신뢰성있는 통신을 하지만
물리 계층을 지나는 구간에서는 신뢰성을 보장할 수 없다
따라서 주고 받는 데이터들이 신뢰성 있는 동작을 하게끔 설계해주어야 한다.
RDT에 대해 자세히 알아보기 전 "신뢰성이 있다"라는 말의 의미는 되짚어 보면 다음과 같다.
1) 비트 에러(bit error)가 없다.
2) 패킷 손실(pakcet loss)이 없다.
이제부터는 다음 규정들을 따름으로써
RDT(Reliable Data Transfer)을 만들어 설계한다.
위 조건을 만족하는 FSM(Finite state machine)은 어떤 구조이고 어떤 원리로
구성되는지 알아보기 위해 sender와 receiver를 나눈 후, stop and wait 방식의 단방향 통신이라 가정하자.
(stop and wait는 rdt를 설명하면서 알아볼 것이다)
1) 완전하게 신뢰성있는 채널이라고 가정
다른 계층에서 직접 받은것들은 아직까지 error와 loss가 없기 때문에
바로 자기 자신으로 돌아가면 된다.
※ above: 상위계층/ below: 하위계층
이제부터는 channel에 신뢰성이 보장되지 않는경우에 대해서 알아본다.
2) 에러만 있는 경우(flip bits in packet)(stop and wait)
ACKs와 NAK를 이용하여 에러의 유무를 학인한다.
- ACKs(Acknowledgement) : receiver가 sender에게 받은 패킷에 문제가 없다고 전달한다.
- NAKs(Negative acknowledgement) : receiver가 sender에게 받은 패킷에 문제가 있다고 전달한다.
그렇다면 FSM에 추가적으로 들어가야 할 내용은 다음과 같다
- error dectection
- feedback: receiver와 sender 사이에 ACK, NAK 전달
- sender는 두 개의 state로 구성
- checksum과 data를 이용하여 패킷을 만들며
checksum은 data가 corrupt되었는지 확인하는 용도로 사용
- ACK를 받으면 다음 단계로 transition된다.
- NAK를 받으면 같은 동작을 한번 더 동작한다.
- 패킷이 not corrupt일때, 데이터를 추출하고 운용계층으로 데이터를 전달
- 마지막에 ACK를 sender로 보냄으로써 잘 받았음을 알린다
- 패킷이 currupt일 때, sender에게 한번 더 보내달라고 NAK를 보낸다.
하지만 이렇게 만들어진 sender와 receiver에는 큰 결점이 있다.
sender는 receiver에서 어떤 일이 일어났는지 모르기 때문에
receiver로부터 ACK 또는 NAK가 왔을 때 sender는 받은 ACK 또는 NAK가
corrupt되었는지 아닌지 알 수 없다.
그렇다면 sender가 패킷 재전송을 하여 확인하면 되는데 이 또한 receiver가
처음 보내는 신호인지 아니면 확인차 보내는 신호인지 알 수없다.
즉 같은 신호를 중복해서 받게 될 가능성이 있다.
그래서 Sequential number를 추가하여 중복 문제를 해결한다.
3) Sequence number를 추가한 RDT모델
stop and wait 모델이기 때문에 sender는 패킷 하나를 보낸 후, 응답을 기다린다.
패킷이 하나이므로 sequential number는 0과 1만 있으면 된다.
(sequence number를 많이 증가시킬 필요가 없다.)
- 4개의 state로 구성되어 sequential number(0과 1)을 주고 받는다.
- sender는 리시버가 중복된 패킷을 받았는지 학인하기 위해 NAK0
,NAK1 또는 ACK을 기다린다.
- receiver는 2개의 state로 재설계된다.
- receiver는 패킷이 corrupt되었을 때 sender에게 NAK를 보내 패킷 재전송을 요청하고,
잘못된 seq_number를 가진 패킷을 받는다면 이미 받은 패킷(즉, 중복처리)은 ACK를 보내
이미 받았다는 것을 알려준다.
4) NAK가 없는 프로토콜
기존의 rdt 프로토콜은 ACK와 NAK를 이용하여 패킷의 corrupt 유무를 판단하였다.
하지만 중복을 막기 위해 seq number가 도입되면서 ACK와 seq number를 통해
NAK를 표현할 수 있게 되었고 NAK가 없어도 위와 동일한 rdt동작이 가능하다.
다음의 상황을 통해 알아보자
sender는 패킷을 보낸 후, ACK0을 기다리는 상황이다.
receiver는 패킷을 받은 후, packet이 corrupt되었다는 것을 판단한다.
receiver는 sender에게 패킷이 corrupt되었다는 것을 알리기 위해 ACK1을 보낸다.
ACK0을 기다리던 sender는 ACK1을 받은 후, 패킷에 문제가 있다는 것을 알고 재전송을 한다.
마지막은 error와 loss가 같이 있는 경우인데 이는 다음 포스팅에서 알아본다.
간략하게 설명하면 loss는 error와는 다른 새로운 차원의 문제이기 때문에
checksum, sequence number, ACK는 의미가 없어진다.
그래서 reasonable한 시간동안 ACK가 없으면 loss라고 생각하고 패킷을 재전송을 한다.
하지만 실제로는 loss가 아니라 delay문제일 수도 있으며 이에 대한 타이머(Timer) 설계가 필요하다.
타이머에 대한 자세한 내용은 다음 포스팅에서 하겠다.
※전공 공부용으로 작성했습니다.
출처: computer networking a top down approach
반응형'네트워크' 카테고리의 다른 글
네트워크: Transport layer 정리3 (TCP Flow Control, Congestion Control...) (0) 2020.10.06 네트워크: Transport layer 정리2 (신뢰적 데이터 전송의 원리 Reliable Data Transfer) (0) 2020.10.05 네트워크: Application layer 정리2(DNS, P2P, CDN) (0) 2020.09.28 네트워크: Application layer 정리(HTTP, Proxy, SMTP, POP, IMAP) (0) 2020.09.20 네트워크: Delay in Network, Protocol layer, Network security 정리 (0) 2020.09.20