이번에는 4번째 계층인 전송 계층
에 대해 알아보도록 하겠습니다.
이전에 배운 물리 계층, 데이터 링크 계층, 네트워크 계층
만 있어도 네트워크는 데이터를 전송할 수 있습니다. 하지만 도중에 오류가 발생하거나 데이터 손상이 발생할 경우 세 가지 계층으로만은 처리를 할 수 없게 됩니다. 따라서 전송에 신뢰성
을 더하고자 전송 계층
이 필요하게 되었습니다.
전송 계층
은 목적지에 신뢰할 수 있는 데이터를 보내기 위한 계층입니다. 전송 계층
은 크게 연결 제어, 종단간 흐름 제어, 에러 제어
를 수행합니다.
전송 계층
은 크게 두 가지의 방식의 통신을 수행합니다.
연결형 통신
은 신뢰성 높은 데이터를 전달하는 방식입니다. 송신지와 수신지가 서로 응답을 주고받으며 데이터를 확인한 후 통신을 수행합니다.
반면 비연결형 통신
은 효율성을 중시하는 통신 방식입니다. 응답 과정 없이 데이터를 일방적으로 보내기 때문에 데이터를 빠르고 효율적으로 보낼 수 있게 됩니다.
말만 들으면 신뢰성이 부족한 데이터 통신은 하고싶지 않아보이지만, 대표적으로 유튜브의 영상이 비연결형 통신을 수행합니다. 동영상의 경우 빠르게 영상을 통신해서 보여주는 것이 목적이기 때문입니다.
전송 계층에서는 연결형 통신에 TCP
를 사용하고, 비연결형 통신에 UDP
프로토콜을 사용합니다.
TCP(Transmission Control Protocol, 전송 제어 프로토콜)
은 전송 계층에서 연결형 통신을 위해 사용하는 프로토콜입니다.
3 Way Handshake
를 통한 연결 설정과정ACK
를 사용한 신뢰성 보장.IP
나 데이터 링크 계층
과 마찬가지로 TCP
로 데이터를 보낼때도 헤더가 붙습니다. 이 헤더를 TCP 헤더
라고 하며 TCP 헤더가 붙은 데이터를 세그먼트(Segment)
라고 부릅니다. TCP 헤더
에는 목적지까지 데이터가 올바르게 전송될 수 있도록 하는 정보들이 담기게 됩니다.
TCP 헤더
는 최소 20바이트부터 옵션을 더하면 60바이트의 크기를 갖습니다.
TCP 헤더
는 송신지 포트 번호, 수신지 포트 번호, 일련번호, 확인 응답 번호, 헤더 길이, 예약, 제어 필드(코드 비트), 윈도우 크기, 체크섬, 긴급 포인터, 옵션의 11가지 필드로 구성되어 있습니다.
출처
전송 계층은 세그먼트(데이터)의 목적지가 어떤 응용 프로그램인지를 구분하여 보냅니다. 이때 응용 프로그램을 구분하기 위해 사용하는 것이 포트 번호
입니다.
포트 번호
는 0~65535번 사이의 숫자를 사용할 수 있습니다. 이 중 0~1023
번 포트는 잘 알려진 포트 번호(well-known port)
라고 해서 주요 프로토콜들이 예약되어 사용되고 있습니다.
잘 알려진 포트 번호는 대표적으로 다음의 것들이 있습니다.
SSH: 22
,SMTP: 25
,DNS: 53
,HTTP: 80
,HTTPS: 442
1024~49151
번 포트는 등록된 포트(registered port)
라고 합니다. 이 번호는 특정 용도로 사용하기 위한 포트 번호들 입니다.
등록된 포트 번호는 대표적으로 다음의 것들이 있습니다.
3306: MySQL; SQL을 사용하는 RDBMS를 사용하기 위한 포트
,3389: 원격 접속
,8080: HTTP의 대체
49152~65535
번의 포트는 동적 포트(dynamic port)
라고 해서 임시적으로 할당되는 포트번호들 입니다.
포트 번호는 간단하게 아파트의 호수라고 생각하시면 편합니다. 아파트에 사는 특정 주민에게 뭔갈 보내려면 호수를 알고 있으면 정확하게 보낼 수 있겠죠?
일련 번호(sequence number)
는 송신지에서 수신지에 이 데이터가 몇 번째의 데이터인지를 알려주는 번호입니다.
확인 응답 번호(acknowledgement number)
는 수신지가 몇 번째 데이터를 받았는 지를 송신지에 알려주는 번호입니다. 수신지는 이 번호를 확인하고 다음에 몇 번 번호를 보내달라고 요청하게 됩니다.
TCP 헤더의 제어 필드
에는 6가지 플래그(비트)가 있습니다. URG, ACK, PSH, RST, SYN, FIN
송신지와 수신지는 일련 번호와 확인 응답 번호를 한 번씩 교환하며 통신을 수행합니다. 하지만 이렇게 세그먼트(데이터)를 하나하나 확인/응답하면 효율이 낮아지게 됩니다. 그래서 효율을 위해 한 번에 여러 개의 세그먼트를 전송하고 확인/응답 합니다.
수신지는 이렇게 받은 여러개의 세그먼트들을 버퍼
라는 공간에 저장합니다. 이 버퍼는 수신지의 장치마다 다 다른데, 버퍼가 넘치게 되면 세그먼트들이 유실될 수 있습니다. 따라서 이러한 일이 발생하지 않도록 버퍼의 최대 크기를 저장하는데 이것을 윈도우 크기
라고 부르게 됩니다.
윈도우 크기
는 처음 연결 설정을 하는 과정에서 계산되어 처리됩니다.
TCP를 조금 전에 다루면서 연결 설정 과정을 3 way handshake
를 통해 한다고 했습니다. 이 이름은 연결을 하기전에 패킷 요청을 3번 보낸다고 하여 붙여진 이름입니다.
연결 설정은 SYN, ACK
를 이용해서 이루어집니다.
1. 송신지(혹은 클라이언트)의 컴퓨터는 수신지(혹은 서버)에 연결을 요청하는 SYN 패킷을 보냅니다. 이때 송신지의 컴퓨터는 수신지로부터 응답을 기자리는 SYN_SENT 상태가 됩니다.
- 수신지는 SYN 요청을 받으면 허가한다는 의미의 SYN과 ACK 플래그가 담긴 패킷을 보내고, 송신자로부터 ACK 응답을 기다립니다. 이때 수신지는 SYN_RECEIVED 상태가 됩니다.
- 송신지는 SYN+ACK 패킷을 받은 후, 수신지에 ACK 패킷을 보내면 연결 설정이 완료가 되고, 데이터를 통신할 수 있는 상태가 됩니다. 이때 수신지는 EST_ABLISHED 상태가 됩니다.
3 way handshake
는 이런식으로 3단계의 요청/응답을 거치며 신뢰성있는 연결을 하게 됩니다.
연결 해제 과정에서는 SYN대신 FIN
이라는 플래그를 사용하게 됩니다.
정확하게는 4단계의 요청/응답을 거쳐서 4 way handshake
이라고 부릅니다.
1. 송신지(혹은 클라이언트)가 연결을 종료하겠다는 FIN 신호를 수신지(혹은 서버)로 보냅니다.
- 수신지는 FIN을 받았다는 확인 신호 ACK를 보냅니다.
- 수신지의 통신도 종료되면 연결을 종료했다는 FIN 신호를 송신지로 보냅니다.
- 송신지도 FIN 신호를 받았다는 확인 신호 ACK를 수신지로 보냅니다.
이렇게 4단계의 요청/응답을 거치며 TCP는 연결 종료를 하게됩니다.
네트워크 지연으로 인해 연결 종료 후 도착하게 되는 경우가 있기에 송신지(혹은 클라이언트)는 수신지(혹은 서버)로 부터 FIN을 수신한 후에도 일정 시간(최소 240초) 동안 세션을 유지하고 남은 패킷을 기다리는 상태가 있습니다. 이를 TIME_WAIT 상태라고 합니다.
UDP(User Datagram Protocol)
은 TCP와 다르게 신뢰성 보단 데이터 전송의 효율성을 중시한 비연결형 통신방식 입니다. 위에서도 언급했지만 데이터를 효율적으로 빠르게 보내는 것을 목적으로 한 통신 방식이므로 동영상 스트리밍 서비스에서 많이 사용하게 됩니다.
UDP도 마찬가지로 헤더가 붙는데, 데이터에 UDP 헤더가 붙은 데이터를 UDP 데이터그램
이라고 합니다.
UDP 헤더는 8바이트 고정 크기 헤더로, 송신지 포트 번호, 수신지 포트 번호, 길이, 체크섬으로 이루어져 있습니다. 신뢰성이 필요 없는 통신이므로 TCP 헤더와 비교하면 상당히 간단한 구성을 갖고 있음을 볼 수 있습니다.
출처
UDP
는 이러한 특징들 덕분에 일괄적으로 데이터를 보내는 브로드캐스트
에 적합합니다.