Transport Layer

|


이번 글에서는 전송 레이어에 대해 대략적으로 설명한다. 앞의 개요 글에서도 설명했듯이 TCP/IP 프로토콜에서 계층은 물리,데이터링크,네트워크,전송,어플리케이션 레이어로 나눠진다. 물리 레이어에서는 실질적인 데이터 전송이 이루어지고, 데이터 링크에서는 frame 단위로 데이터를 나누는데 여기에는 도착지의 물리 주소(맥 주소)를 담아 hop to hop delivery를 가능하게 한다.네트워크 레이어에서는 datagram단위로 데이터를 나누고,여기에 논리 주소 - IP주소를 담아 source to destination을 가능하게 한다. 전송 레이어에서는 데이터를 segment(혹은 패킷)으로 나누고 프로세스의 포트 번호를 담아 process to process를 가능하게 한다. 여기서 전송 레이어의 세부적인 내용을 살펴보고자 한다.

앞서 말한대로 전송 레이어에서는 데이터에 포트 정보를 추가한다.(IP주소와 포트번호의 합을 소켓 주소라고 하는데, 클라이언트와 서버의 소켓주소가 패킷에 포함되게 된다소켓이란, 네트워크/프로세스 간 출입구를 의미하고,TCP/IP에서 소켓의 종류는 UDP,TCP로 나뉘어진다.) 주의할 점은 서버와 클라이언트는 다른 포트 번호를 사용한다는 점이다.서버 쪽의 포트는 어플리케이션마다 보통 고정이고,(예로 HTTP는 80번 포트를 사용한다.) 클라이언트의 포트는 시스템에서 임의로 정한다. 패킷에는 보내는 측 프로세스의 포트 번호와 받는 측 프로세스의 포트 번호가 같이 들어가게 된다.이는 클라이언트에서 역방향으로 데이터를 보낼 때 반대편의 포트 번호를 알아야 하기 때문에 그렇다.클라이언트의 포트 번호는 보통 시스템에 의해 할당되어진다.
포트 번호는 0~1023까지는 고정적으로(well known) 배정되어 있다.즉 이외의 프로세스들은 이 범위 밖의 번호들을 사용한다.

TCP와 UDP를 먼저 간략하게 설명하자면, 둘 다 Transport Layer의 프로토콜이고, 헤더에 오류 검출 필드를 포함함으로써 무결성 검사를 제공한다. 그러나, UDP는 해당 데이터가 손상되지 않고(무결성 검사를 제공하기는 하지만 보장하지는 않는다) 전부 도착했는지를 보장하지 않는다. 반면 TCP는 흐름제어,순서번호,확인응답,타이머 등을 사용함으로써 수신쪽에 순서대로 정확하게 전달되는것을 보장한다. 비신뢰성 프로토콜인 IP를 보완해 TCP/IP를 신뢰적인 데이터 전송 서비스로 만들어준다. 

TCP던 UDP건, 트랜스포트 계층에서 데이터를 올바른 소켓으로 보내는 작업을 demultiplexing(역다중화)라고 한다. 반대로, 소켓으로부터 데이터를 모으고 세그먼트를 생성하기 위해 헤더 정보를넣어 캡슐화한 후에 네트워크 계층으로 전달하는 것을 multiplexing(다중화)라고 한다.

소켓은 포트 번호로 구분된다. 따라서 세그먼트에는 출발지와 도착지의 포트 번호를 담는 필드가 있다.세그먼트가 호스트에 도착하게 되면, 트랜스포트 계층은 세그먼트 안의 목적지 포트 번호를 검사하고 그에 맞는 소켓으로 세그먼트를 보내게 된다. 출발지 포트 번호는 세그먼트가 다시 출발지로 돌아갈 때 목적지 포트 번호로 사용된다.
UDP 소켓이 목적지 IP주소와 목적지 포트 번호로 구분되는것에 비해,TCP는 4개 요소(출발지,목적지의 IP와 포트 번호)로 구분된다. 이 말은, UDP는 어디서 왔던 도착지의 소켓 주소가 같다면 같은 소켓으로 가지만, TCP에서는 같은 도착지라도 출발지가 다르면 다른 소켓으로 간다는 뜻이다.

 

 

 

 




정보를 생산자(producer)로부터 소비자(consumer)로 전달하는 방법은 push와 pull 두가지 방법으로 이루어질 수 있다.
push는 소비자의 요구가 들어오기 전에 데이터가 생성될 때마다 전송 쪽으로 보내는 식이고,
pull은 소비자가 요구한 경우에만 정보를 전송하는 식이다.


푸시는 만일 소비자의 소비속도보다 보내는 속도가 높아지게 된다면, 버퍼가 꽉 차게 되면 데이터가 유실되게 되므로 소비측에서 생산측에게 보내는 속도를 조절하도록 요청해야 한다. 이것이 흐름제어(flow control)의 개념이다.
풀은 소비자의 요청이 있어야만 보내므로 흐름제어가 필요하지 않다.


이제 전송 레이어에서 흐름제어가 어떻게 이루어지는지 보자.


보내는 측에서 어플리케이션 레이어에서 데이터를 전송 레이어로 보내면, 전송레이어의 소비자는 이를 받아 세그먼트로 만들어 받는 쪽으로 보내야 한다.(물론 실제 전송은 물리 레이어에서 이루어진다) 여기서 보내는 속도가 생산량보다 작다면 전송 레이어는 어플리케이션 레이어에게 보내는 메시지의 양을 줄여야 한다고 흐름 제어를 해야 한다. 마찬가지로 받는 쪽에서도 어플리케이션 레이어에서 소비하는 속도가 보내는 쪽에서 보내는 속도보다 느리다면 데이터 손실을 막기 위해 흐름제어를 해야 한다.

이 흐름 제어를 수행하기 위해서 TCP/IP에서는 버퍼에 슬라이딩 윈도우라는 개념을 적용한다.


위 그림에서 숫자는 패킷의 sequence number - 즉 패킷에 붙여진 번호다. 0부터 차례로 나열되어 있다.모든 칸이 칠해진다면 버퍼가 꽉 찼다는 뜻으로, 더 이상 보내거나 받을 수 없다는 뜻이다. 만일 받는 쪽에서 수신이 확인되거나 어플리케이션에서 가져다 쓰게 되었다면 확인된 패킷번호는 해제되어 새로운 패킷이 들어올 수 있도록 한다.굵은 선으로 칠해진 영역은 윈도우 사이즈로 보낼 수 있는 양을 뜻한다.
a에서는 윈도우 사이즈가 7로, 이 중 4개가 전송되었다.b에서 한개가 더 전송되었고, c에서는 한개가 더 전송되어 윈도우가 꽉 차게 되었다.이 때 윈도우가 꽉 차 더 이상 보낼 수 없게 되었다.d에서는 0번 패킷이 수신 확인되었으므로 윈도우가 밀려(sliding window) 보낼 수 있는 양이 하나 생기게 된다.

개요에서 전송 레이어는 패킷의 오류를 책임진다고 했는데,TCP/IP에서는 세그먼트의 sequence number로 패킷의 순서를,check sum으로 패킷의 오류를 검출한다.

전송 레이어에서는 위에서 본 대로 흐름 제어,에러 제어를 책임지는데,(TCP에서) 이에 추가로 혼잡 제어(Congestion Control)를 책임진다.
만일 두 개의 컴퓨터에서 100Mbps로 데이터를 보낸다고 하자. 두 컴퓨터에서 데이터를 받는 라우터에서 문제가 생겨 보내는 속도가 50Mbps다. 결국 받는 양은 200이므로 라우터의 버퍼가 꽉 차버리게 된다.(받는 속도 > 처리하는 속도) 이렇게 되면 정체가 발생해 데이터가 유실되게 된다.이를 방지하기 위해 TCP 프로토콜에서는 보내는 양을 늘였다 줄였다 조절해가며 네트워크의 상황을 추측해 보낸다. 이것이 바로 혼잡 제어의 개념이다.

이러한 흐름 제어 , 오류 제어, 혼잡 제어 중 흐름 제어와 오류 제어를 동시에 사용해 Relibility를 보장하기 위한 프로토콜 중 하나가 Stop & Wait 방식이다.
자세한 내용은 나중에 설명하겠지만 대략적인 개념은 일단 보낸 것을 수신했는지 확인(ACK을 통해)하고 다음 데이터를 보낸다. 다만 이 방식은 기다리는 과정에서 아무것도 하지 않으므로 흐름 제어를 사용해 보내는 양을 적절히 조절해서 보내게 된다.(수신 측의 window사이즈를 통해서)또한 정해진 시간 안에 ACK이 오지 않으면 해당 패킷을 재전송해 패킷 유실이 없도록 한다.그리고 패킷이 훼손되었는지를 검사하기 위해 각각의 데이터 패킷에 checksum이라는 필드를 추가해 수신측에서 패킷을 검사할 수 있도록 한다.

전송 레이어의 프로토콜은 비연결형과 연결형 두 가지의 형태의 서비스를 제공한다.
먼저 비연결형 서비스는 발신과 수신 사이에 사전적 connection setup(논리적 연결)이 이루어지지 않는다.따라서 발신측은 수신측에서 패킷을 제대로 받았는지 여부를 알 수 없다.즉 ACK이 반대편으로 가지 않는다는 말이다. 따라서 이 연결 형태에서는 흐름제어와 혼잡제어,오류 제어를 하지 않는다.패킷이 유실되거나 순서가 바뀌어도 발신측은 알 수 없다.UDP가 이러한 형태의 프로토콜이다.

연결형은 일단 사전에 수신과 발신 사이에 사전적으로 connection setup이 일어난다. 데이터 교환은 연결이 설정된 후에 가능하고 교환이 완료되면 연결이 해지된다.이 형태에서는 수신측이 발신측에 데이터를 받으면 받았다고 ACK을 보내기 때문에 흐름,오류,혼잡 제어가 가능하다.패킷이 유실되었다면 ACK이 가지 않게 되므로 발신측은 이를 알아차리고 재전송을 할 수 있게 된다. TCP가 이러한 형태의 프로토콜이다.


신고

'ComputerEngineering > Network' 카테고리의 다른 글

[추가중] OVS command  (0) 2017.02.13
OVS - ODL Setup.  (5) 2017.02.13
BitTorrent  (0) 2016.12.16
TCP  (0) 2014.05.09
Transport Layer  (0) 2014.04.27
개요  (0) 2014.04.26
trackback 0 And comment 0