네트워크 계층을 설명할 때 다른 네트워크로 데이터를 전송하려면 라우터가 필요하고, 라우터의 라우팅 기능을 사용해 전송할 수 있다고 했다. 문제는 이렇게 데이터를 전송하더라고 목적지에 잘 도착하지 않을 수도 있다는 것! 우리가 편지를 보낼 때도 예기치 못한 사고로 인해 배송이 지연되거나 중간에 분실되거나 할 수 있는 것처럼 말이다. 물리 계층, 데이터 링크 계층, 네트워크 계층을 통해서 목적지에 데이터를 보낼 수는 있지만, 배송 과정에서 데이터가 손상되거나 유실되더라도 이들은 아무것도 해주지 않는다 즉 책임을 지지 않는다. 참으로 괘씸하기 짝이 없다. 이 때 전송 계층(transport layer)는 목적지에 신뢰할 수 있는 데이터를 전달하기 위해 필요한 계층으로, 오류를 점검하는 기능이 있다! 이를 통해 오류가 발생하면 데이터의 재전송을 요청하기도 한다. 다시 말하면 네트워크 계층이 목적지까지 데이터를 전달하는 역할을 한다면 전송 계층에서는 데이터가 제대로 잘 갔는지 확인하는 역할을 하는 것이다.
전송 계층은 오류 점검말고도 한 가지 역할을 더 수행한다. 건물로 편지를 잘 보냈지만 그 건물 어느 호실에 편지를 전해야 할 지 모른다면 어떠겠는가? 마찬가지로 컴퓨터가 데이터를 받아도 어떤 애플리케이션에 전달해야 하는지 모른다면 곤란하게 된다. 전송계층에서는 전송된 데이터의 목적지가 어떤 애플리케이션인지 식별하는 역할 역시 수행한다.
전송 계층의 특징을 간단히 설명하면 신뢰성/정확성과 효율성으로 구분할 수 있다. 신뢰성/정확성은 데이터를 목적지에 문제없이 전달하는 것을, 효율성은 데이터를 빠르고 효율적으로 전달하는 것을 의미한다. 이 때 신뢰할 수 있고 정확한 데이터를 전달하는 통신을 연결형 통신이라고 하고, 효율적으로 데이터를 전달하는 것을 비연결형 통신이라고 한다. 좀 더 설명하자면 연결형 통신은 상대편(수신자)와 하나하나 확인하면서 데이터를 전송하는 방식이고, 비연결형 통신은 일방적으로 데이터를 전송하는 방식이다.
ex) 연결형 통신
A : 보내도 돼?
B : 네, 보내세요
A : 보냅니다!
B : 받았슴다~!
A : 확인~
ex) 비연결형 통신A : 보낸다~수고~
이는 당연한 얘기지만 연결형 통신은 신뢰성/정확성을 우선으로 하는 통신이고, 비연결형 통신은 효율성을 우선으로 하는 통신방식이기 때문에 그렇다. 그럼 여기서 궁금한 점이 생길 수 있다. 신뢰성과 정확성이 보장되지 않는 저 상도덕 없이 일방적으로만 보내는 비연결형통신을 사용하는 경우가 있는가? 정답은 당연히 Yes, 예를 들면 동영상을 시청할 때다. 동영상은 아무래도 빠른 전송이 필요하기 때문! 정확하게 하나하나 확인하면서 한다고 하면 데이터가 늦게 도착해 화면이 버벅거리는 영상을 보게 될텐데, 그것보다는 좀 유실되더라도 원활하게 보는 것이 낫기 때문이다. 이 연결형 통신의 프로토콜로는 그 유명한 TCP가 쓰이고, 비연결형 통신 프로토콜로는 UDP가 사용된다.
TCP의 구조 [1] 3-way handskake
다른 계층과 마찬가지로 전송계층에서 TCP프로토콜로 데이터를 전송할 때도 데이터에 TCP헤더를 붙여서 덩어리를 만들어 보내며, 이 덩어리를 세그먼트라고 한다. 이 TCP헤더에는 출발지 포트 번호, 목적지 포트 번호, 일련번호, 확인 응답 번호..등과 같은 다양한 정보들이 담긴다. 앞서 말했듯 TCP는 꼼꼼하게 상대방을 확인하면서 데이터를 보내는 연결형 통신이기 때문에 사실 데이터를 전송하기 전에 해야 하는 작업이 있다. 그건 바로 데이터를 전송하기 위해 연결(connection)이라는 가상의 우리 둘만의♡(즉 독점적인) 통신로를 확보하는 것이다. 이 연결을 확보한 후에 데이터를 전송할 수 있다.
이 연결을 그럼 어떻게 확보하는가? TCP헤더를 보면 107 ~ 112비트까지의 총 6비트로 구성된 '코드 비트'라는 정보가 있다. 이 코드 비트에 연결의 제어 정보가 기록되는데, 6개 비트가 각 비트별로 역할이 있다. 6개 각 비트들에는 URG, ACK등 각각을 칭하는 이름이 있으며 이들의 초깃값은 0이고 활성화되면 1이 된다. 이 때 우리가 원하는 '연결'을 확보하려면 이 중 SYN과 ACK가 필요하다. SYN은 연결 요청, ACK는 확인 응답을 뜻한다. 이 두 녀석을 활용해 '연결'은 다음과 같이 3-way handshake로 확립된다.
ex)컴퓨터 A, B가 있고 A가 B랑 연결을 확보하고 싶은 상황.
1) A가 먼저 B에게 허가를 받아야 하므로 연결 확보 허가를 받기 위한 요청(SYN)을 보낸다2) B는 A가 보낸 요청을 받은 후 허가한다는 응답을 회신하기 위해 ACK를 A에게 보낸다. 이와 함께 B 역시 A에게 데이터 전송 허가를 받기 위해 연결 확보 허가를 받기 위한 요청(SYN)을 보낸다.3) B의 요청을 받은 A는 허가한다는 응답(ACK)를 B에게 보낸다.
그림으로 나타내면 다음과 같다.
데이터를 보내기 전에 연결을 확보하기 위해 패킷 요청을 총 3번 교환하므로 3-way handshake라고 부른다. 네트워크 분야에서 이 핸드셰이크(handshake)는 사람들이 상대방을 확인하고 악수하는 것처럼 데이터 통신에서도 확실하게 데이터가 전송됐는지 확인하며 이루어지는 통신 수단을 말한다. 데이터를 다 전송한 후엔(서로 볼 일 다 봤을 땐) 바로 손절하는게 아니라 젠틀하게 연결을 끊기 위한 요청을 교환하는데, 이 때는 FIN과 ACK를 사용한다.
TCP의 구조 [2] 일련번호와 확인 응답 번호의 구조
3-way handshake를 했다면 이제 데이터 전송을 해야 된다. 데이터 전송을 할 땐 이 땐 TCP헤더에서 일련번호와 확인응답번호가 쓰인다(둘 다 32비트). TCP는 데이터를 분할해서 보내게 되는데 일련번호는 순서를 가진 연속된 번호로 송신측에서 수신측에게 "이 데이터가 몇 번째 데이터야"라고 알려줄 때 쓰인다. 이를 통해 수신자는 이 데이터가 원래 데이터의 몇 번째 데이터인지 알 수 있다. 확인 응답 번호는 수신자가 송신자에게 몇 번째 데이터를 수신했는지 알려줄 때 쓰이는 번호로, 10번 데이터를 받았다면 송신자에세 확인 응답 번호로 11번을 보낸다. 뭐 굳이 뜻을 붙이자면 "저는 10번 데이터를 받았으니, 그 다음 번호인 11번을 주시면 됩니다" 하는 것이다. 이 작업을 '확인 응답'이라고 부른다.
좀 더 구체적으로 설명하자면, 일련번호는 내가 보내는 데이터의 첫 번째 바이트 번호이다. 3001번 ~ 3200번까지의 200바이트짜리 데이터를 보낸다고 하면 일련번호는 3001이 되는 것. 이를 받는 쪽은 3001 ~ 3200번까지의 200바이트 데이터를 받았으니 다음엔 3201번부터 받을 차례이므로 확인 응답 번호로 3201을 보낸다. 이를 통해 내가 보낸 데이터가 잘 갔는지 확인이 가능하다. 데이터가 항상 올바르게 전달되는 것은 아니므로 일련 번호와 확인 응답 번호를 사용해 데이터가 손상되거나 유실된 경우가 확인되면 데이터를 재전송할 수 있는 것! 이를 재전송 제어라고 한다.
이때까지 설명한 것은 세그먼트 하나를 보낼 때마다 확인 응답을 한 번 반환하는 통신이었다. 그러나 이 방법은 당연히 효율이 좋지 않다. 애시당초 연결형 통신 자체가 신뢰성/정확성을 우선시하는 통신이긴 하지만 그럼에도 불구하고 너무나도 극악의 효율이라는 것이다. 그러나 매번 하나 보내고 확인 응답 기다리고..를 반복하는 것보단 세그먼트를 연속해서 촤라락 보내고 난 다음에 확인 응답을 반환한다면 어떨까? 효율이 더 높아질 것이다! 그러나 이 경우 상대방 쪽에선 세그먼트가 점점 쌓일 것이라는 문제를 제기할 수 있는데, 받은 세그먼트를 일시적으로 보관할 수 있는 장소인 버퍼(buffer)가 있어서 괜찮다. 이 버퍼 덕분에 송신자 측에서 세그먼트를 연달아 보내도 수신 측은 대응이 가능하고 확인 응답의 효율이 높아진다.
그러나 버퍼의 크기는 정해져있기 마련이므로 너무 대량의 세그먼트를 받으면 처리하지 못하는 경우도 생긴다. 버퍼가 넘치게 되는 현상을 오버플로(overflow)라고 부르며, 이 오버플로가 발생하지 않도록 버퍼의 한계 크기를 알고 있어야 한다. 이것이 TCP헤더의 윈도우 크기 정보에 해당하는 부분이다. 윈도우 크기는 버퍼가 얼마나 많은 용량의 데이터를 저장해 둘 수 있는지에 대한, 즉 확인 응답을 일일이 하지 않고 연속해서 송수신 가능한 데이터 크기를 말한다. 이 윈도우 크기의 초깃값은 3-way handshake를 할 때 판단하며, 보내는 쪽의 윈도우 크기를 담아서 보내게 된다.
ex) 컴퓨터 A가 B에게 SYN을 보낼 때 자신의 윈도우 크기를 담아서 보내고, B는 이를 통해 A의 윈도우 크기가 몇이구나를 알게 됨
이렇게 상대방의 윈도우 크기를 알게 됐다면 상대방 버퍼의 한계치를 알게 된 것이니, 세그먼트를 오버플로되지 않도록 보내면 되는 것!
TCP의 구조 [3] 포트 번호의 구조
지금까지 연결 확보, 재전송 제어, 윈도우 크기에 대해 알아봤고 이들을 통해 TCP는 정확한 데이터 전송이 가능했다. 앞서 설명했듯 TCP는 이것 말고도 한 가지 역할을 더 하는데, 그건 바로 수신한 데이터가 어떤 애플리케이션에 가야 하는지 구분하는 역할이었다. 이를 위해 TCP헤더에는 출발지 포트 번호와 목적지 포트 번호에 대한 정보가 있고, 이를 통해 어떤 애플리케이션으로 가야 하는지 구분할 수 있다. 둘 다 16비트를 갖는 녀석으로 0 ~ 65535번까지의 포트번호를 쓸 수 있다고 생각할 수 있지만, 0 ~ 1023번 포트는 주요 프르토콜이 사용하도록 예약된 포트이다. 1024번은 예약되어 있지만 안 쓰는 포트고, 1025번 이상부터 랜덤 포트라고 부르며 클라이언트 측의 손싱 포트로 사용된다. 0 ~ 1023번 포트는 주로 서버 측 애플리케이션에서 사용된다.
아무튼, 컴퓨터 상에서 애플리케이션들은 각각 포트 번호가 있어서 다른 애플리케이션과 구분되며, 데이터를 전송할 땐 상대방의 IP주소가 필요하지만 어떤 애플리케이션에게 줄 지를 결정하기 위해서 TCP는 꼭 포트 번호가 필요하다. 즉 일종의 창구 역할을 하는 것이 포트라고 생각할 수 있는 것.
UDP의 구조
UDP는 비연결형 통신이기 때문에 데이터를 전송할 때 TCP처럼 시간이 걸리는 확인 작업을 일일이 하지 않는다. 왜 why? 얘는 효율성을 더 우선시하는 통신방법이니까. 때문에 UDP의 장점은 데이터를 효율적으로 빠르게 보내는 것에 있기 때문에.
TCP에서는 TCP헤더를 붙인 덩어리를 세그먼트라고 불렀던 반면 UDP는 UDP헤더를 붙인 덩어리를 UDP 데이터그램이라고 부른다. 이 녀석도 출발지 포트 번호, 목적지 포트 번호 등의 정보를 가진다. TCP와의 또 한 가지 차이점은 TCP는 번거롭게 여러 번 확인 응답을 보내며 전송하던 반면 UDP는 상대방을 확인하지 않고 연속해서 데이터를 보낸다! 즉 확인 응답 하지 않고 A쪽에서 B쪽으로 와다다다 데이터를 보내기만 하는 구조이다. 또한 UDP를 사용하면 랜에 있는 컴퓨터나 네트워크 장비에 데이터를 일괄로 보낼 수 있는데 이를 브로드캐스트(broadcast)라고 한다.
지금까지 전송계층에 대해 얘기했다. 다시 한 번 정리하자면, 전송 계층은 신뢰할 수 있는 데이터를 순차적으로 전달하는 역할을 하므로 상위 계층들이 데이터 전달의 유효성 등을(잘 전달됐을까..?) 신경스지 않도록 만들어준다! 상사한테 "신경쓰지 마십쇼. 제 선에서 처리하겠슴다"하면서 자기가 일일이 확인해주는 녀석.
'CS > 컴퓨터네트워크' 카테고리의 다른 글
[컴퓨터 네트워크] 응용 계층 살짝 찍먹 (0) | 2022.04.19 |
---|---|
[컴퓨터네트워크] 네트워크 계층 손으로 쓱 터치하기 (0) | 2022.04.19 |
[컴퓨터네트워크] 물리계층/데이터링크계층 간단하게(feat.MAC주소), 스위치 등에 관한 개념 (0) | 2022.04.19 |
[컴퓨터네트워크] 네트워크 / 랜 / 왠의 뜻, OSI 7계층 (0) | 2022.04.18 |
[컴퓨터 네트워크] 인터넷의 구조 (0) | 2022.03.10 |