- 2계층, 3계층에서 동작하는 프로토콜은 목적지를 정확하게 찾아갈 수 있도록 주소를 제공하는 목적을 가지고 있다. 하지만 4계층에서는 약간 다르다...
- 여러 애플리케이션 프로세스 중 통신해야 하는 목적지 프로세스를 찾아가고, 패킷 순서가 바뀌지 않도록 조합하여 원래 데이터로 만들어내기 위한 역할을 한다.
- 인캡슐레이션과 디캡슐레이션 과정에서 각 계층에서 정의하는 헤더가 추가되고 정보가 들어가는데, 가장 중요한 정보는 각 계층에서 정의하는 정보와 상위 프로토콜 지시자 정보이다. 상위 프로토콜 지시자는 디캡슐레이션할 때 상위 계층의 프로토콜 또는 프로세스를 정확하게 찾아가기 위해 사용된다. 2계층에선 이더 타입, 3계층에선 프로토콜 번호, 4계층에서는 포트 번호이다.
- TCP/IP 프로토콜 스택에서 4계층은 TCP(Transmission Control Protocol), UDP(User Datagram Protocal)가 담당한다.
- 위에서 말했 듯이 4계층은 애플리케이션에서 사용하는 프로세스를 정확히 찾아가고 분할한 패킷을 적절하게 쪼개고 조립하는 것을 목표로 하고 있다. 이러한 패킷 분할 및 조립을 위해서 TCP 프로토콜에선 시퀀스 번호와 ACK 번호를 사용한다.
- 4계층 프로토콜 지시자인 포트 번호는 출발지와 목적지를 구분하여 처리해야 한다.
- 여기서 포트 번호는? 서버의 포트를 뜻한다. HTTP 80, HTTPS 443과 같이 잘 알려진 포트는 웰 노운 포트(Well Known Port)라고 부른다.
* 애플리케이션에 포트를 할당할 때는 1024~49151 범위를 사용한다.
* 주요 포트 번호를 확인하고 싶다면 운영체제 내부 파일인 protocols, services 파일에서 찾아볼 수 있다.
TCP(Transmission Control Protocol)
- 4계층에서 동작하는 프로토콜 중 하나로, 신뢰할 수 없는 공용망에서도 세션을 안전하게 연결할 수 있으며 데이터를 분할하고 분할된 패킷이 잘 전송되었는지 확인하는 기능이 있다. → 어떻게? 패킷에 번호(시퀀스 넘버)를 부여하고, 잘 전송되었는지 응답(ACK)한다. 그리고 무려 전송 크기(윈도 사이즈)까지 고려하여 통신한다.
- 중요한 건 이 과정에서 순서가 맞는지 확인한다는 것이다. 그리고 출발지 포트와 목적지 포트 정보가 담겨 있다는 점을 기억해야 한다.
- 이러한 송수신이 이루어질 때 송신자와 수신자가 멀리 떨어져 있으면 왕복 지연시간(Tound Trop Time, RTT)이 늘어나 모든 데이터를 전송하는 데 오랜 시간이 걸리게 된다. 이때, 패킷을 하나만 보내는 것이 아니라 많은 패킷을 한번에 보내고 응답을 하나만 받는 식으로 이루어질 수 있다.
- 데이터를 받을 수 있는 크기를 윈도 사이즈(Window Size)라고 하며, 네트워크 상태에 따라 이 크기를 조절하는 것을 슬라이딩 윈도라고 한다. 최대 윈도 사이즈는 2^16이다.
- TCP는 안전한 통신을 위해 패키을 보내기 전에 사전에 연결 작업을 한다. → 데이터가 유실되면 안 되니까 미리 체크하는 느낌
- 사전 연결 작업을 할 때 3번의 패킷을 주고 받는데, 이를 3-Way Handshake라고 한다.
- 3-Way Handshake 과정에서 진행 상황에 따라 상태 정보를 부르는 이름이 있다.
클라이언트 | 서버 | ||
SYN-SENT | 통신을 시도할 때 SYN 패킷을 보냄 | 접속을 받아들일 수 있는 상태 | LISTEN |
클라이언트의 SYN을 받음 클라이언트에게 SYN, ACK를 보냄 |
SYN-RECEIVED | ||
ESTABLISHED | 서버에게 SYN, ACK를 받음 서버에게 ACK를 보냄 |
||
클라이언트에게 ACK를 받음 | ESTABLISHED |
- 이러한 사전 연결 과정과 기존에 이미 연결되어 주고 받는 통신에 대한 구분이 필요하다. → 헤더에 플래그(Flag) 값을 넣어 통신한다.
[플래그 종류와 의미]
SYN | 연결 시작 용도 연결이 시작될 때 SYN 플래그에 1로 표시 |
ACK | ACK 번호가 유효할 때 1로 표시 초기 SYN이 아닌 모든 패킷은 기존 메시지에 대한 응답 → ACK가 1로 표시 |
FIN | 연결 종료 시 1로 표시 데이터 전송 마치고 정상적으로 양방향 종료 시 사용 |
URG | 긴급 데이터인 경우 1로 표시 |
PSH | 서버 측에서 전송할 데이터가 없을 때 사용 또는, 데이터를 버퍼링 없이 응용 프로그램으로 즉시 전달할 것을 지시할 때 사용 |
RST | 연결 종료 시 1로 표시 연결 강제 종료를 위해 연결을 일방적으로 끊을 때 사용 |
UDP(User Datagram Protocol)
- TCP는 신뢰성 있는 통신을 위해 미리 연결을 시도하거나 패킷에 번호를 부여하지만, UDP에는 이러한 기능이 전혀 존재하지 않는다. → 비신뢰성, 비연결성이 특징이다.
- 이거 왜 이런 프로토콜을 만들었는지???? → 시간에 민감한 프로토콜이나 단방향으로 다수의 단말과 통신하여 응답을 받기 어려운 환경(예: 사내 방송, 증권 시세 데이터 전송, 실시간 스트리밍, 음성 데이터 등)에서 사용하기 위해 만들었다.
- 그니까 빠르게 전송해야 하기 위해서이다. TCP는 연결을 확립하고... 패킷도 쪼개 보내면서 윈도 사이즈도 고려해야 하고 아주 복잡함! 신뢰성이나 일부가 유실되더라도 시간에 맞추어 계속 전송하는 것이 중요한 서비스에는 UDP를 사용한다.
- 아무튼 TCP처럼 사전에 연결을 확립하는 절차는 따로 없지만, 첫 데이터는 리소스 확보를 위해 인터럽트를 거는 용도로 사용되고 유실된다. → 첫 데이터는 초기화 역할을 하는 것으로, 수신 측에서 필요한 리소스를 활성화하는 트리거로 작용된다.
- 그래서 보통 UDP를 사용하는 애플리케이션은 TCP를 사용하여 연결을 확립한 뒤 실제 데이터에만 사용한다.
[TCP와 UDP 특징 비교]
TCP | UDP |
연결 지향 | 비연결형 |
오류 제어 수행 O | 오류 제어 수행 X |
흐름 제어 수행 O | 흐름 제어 수행 X |
유니캐스트 | 유니캐스트, 멀티캐스트, 브로드캐스트 |
전이중(Full Duplex) | 반이중(Half Duplex) |
데이터 전송 | 실시간 트래픽 전송 |
'네트워크' 카테고리의 다른 글
네트워크 통신하기 - 5 (서브넷, 게이트웨이, L2/L3) (0) | 2024.11.15 |
---|---|
네트워크 통신하기 - 4 (ARP, GARP, RARP) (0) | 2024.11.13 |
네트워크 통신하기 - 2 (MAC 주소, IP 주소) (0) | 2024.11.10 |
네트워크 통신하기 - 1 (유니캐스트, 멀티캐스트, 브로드캐스트, 애니캐스트) (0) | 2024.11.08 |
네트워크 연결과 구성 요소 - 2 (NIC, 케이블/커넥터, 허브, 스위치, 라우터, 로드 밸런서, 보안 장비, 모뎀/공유기) (0) | 2024.11.07 |