네트워크 계층까지가 네트워크 상의 특정 기기까지 어떻게 찾아가는냐를 따졌다면
전송 계층은 호스트상에 구동중인 프로세스들 중 특정 프로세스를 찾아가는 방법의 구현을 담당한다.
이때 사용되는 핵심 개념이 포트
이고 UDP
와 TCP
가 바로 전송 계층의 핵심 프로토콜이다.
오류 복구, 흐름 제어, 신뢰성 있는 데이터 전송이 키워드이다.
송신 측에서는 데이터를 패킷으로 분할, 수신 측에서는 패킷을 결합하여 순서대로 재조립
연결 제어
: 패킷을 하나의 경로로 보낼 것인지 결정수신지로 데이터 전송
: 데이터의 모든 패킷 전송과 도착을 검사단편화
: 데이터를 전송 가능한 Segment로 나누고 Sequence number(순서 번호)를 기록재조립
: 데이터를 순서에 맞게 올바르게 재조립신뢰
할 수 있고 데이터를 정확하게 전송할 수 있음효율
을 중시함서로 수신 가능, 송신 가능함을 알기 위해(신뢰성을 위해) 데이터 통신 전에 연결하기 위한 사전 작업
TCP는 연결형 프로토콜 + stateful 프로토콜
현재 연결 상태를 나타내기 위해 다양한 상태(state) 활용
UDP는 스테이스리스 프로토콜
액티브 클로즈 호스트는 마지막 ACK를 보낸 뒤 일정 시간을 기다리고
연결을 종료한다..!
TCP는 신뢰성 프로토콜
무엇인가를 확실히 전송했다는 보장이 있으려면?
1. 재전송 기반의 오류 제어: 잘못 전송된 경우 재전송
2. 흐름 제어: 받을 수 있을 만큼만 받기
3. 혼잡 제어: 보낼 수 있는 상황에서만 보내기
언제 잘못 되었음을 인지할까??
1. 중복된 ACK 세그먼트를 수신했을 때
2. 타임아웃이 발생했을 때
TCP 오류 제어
네트워크 이용 효율이 낮아지는 문제가 있다
위의 문제를 해결하기 위해서는파이프라이닝
기법을 사용해야 한다.
보낼수 있을 만큼을 한꺼번에 보내는 기법
TCP 흐름제어
슬라이딩 윈도우(sliding window)
윈도우: 파이프라이닝 가능한 순서번호 범위
윈도우 크기: 확인 응답 받지 않고도 한번에 보낼 수 있는 최대 양
수신 호스트
: 수신 윈도우 = 수신 버퍼 크기 - [마지막으로 수신한 바이트 - 마지막으로 읽어들인 바이트]
송신 호스트
: 수신 윈도우 >= 마지막으로 송신한 바이트 - 마지막으로 수신 확인된 바이트
TCP 혼잡제어
: 많은 트래픽으로 인해 패킷 처리 속도가 느려지거나 유실될 우려가 있는 상황
혼잡 윈도우: 혼잡 없이 전송할 수 있을 법한 양(TCP 헤더에는 포함되어 있지 않다)
메세지를 전송한 뒤 그에 대한 답변을 받는 시간
TCP 혼잡 제어 알고리즘
느린 시작
ACK 세그먼트가 수신될 때마다 혼잡 윈도우 1증가(RTT마다 혼잡 윈도우 2배 증가)
특정 임계치값과 같아지면 혼잡 회피 수행
소스 포트 번호
라 하고, 연결을 요청할 포트 번호를 수신지 포트 번호
라고 한다. 소스 포트 번호는 사용중인 프로그램에서 랜덤으로 지정하나 수신지 포트 번호는 정해진 번호를 사용해야 한다서버
는 일반적으로 잘 알려진 포트와 등록된 포트로 동작
클라이언트
는 일반적으로 동적 포트로 동작
포트
는 전송 계층 프로토콜(TCP 또는 UDP)에서 특정 애플리케이션이나 프로세스를 식별하기 위해 사용하는 논리적인 채널로 포트 번호
는 송신자와 수신자가 데이터 흐름을 구분할 수 있도록 도와준다!!
포트번호: 포트 번호는 0에서 65535까지의 범위를 가지며,세 가지로 나뉘어진다
잘 알려진포트: 널리 알려진, 유명한 포트로 0에서 1023까지의 포트 번호로, HTTP(80), HTTPSㅣ(443), FTP(21), SSH(22)와 등과 같은 표준화된 서비스가 사용
등록된 포트: 잘 알려진 포트에 비해서는 덜 범용적이지만 흔히 사용되는 애플리케이션들의 포트 번호로 1024에서 49152까지의 포트 번호로, 특정 애플리케이션이 자주 사용하는 포트가 포함 예를 들어 MySQL(3306), Microsoft SQL Server(1433), Redis(6379), Docker Daemon(2376)
동적 또는 임시 포트: 사용자가 자유롭게 할당 가능한 포트 번호들로 49152에서 65535까지의 포트 번호로 일반적으로클라이언트 애플리케이션이 임시로 사용하는 포트
서버는 일반적으로 고정된 포트 번호를 사용해 클라이언트의 요청을 수신하며 클라이언트는 서버에 연결할 때 일반적으로 임시 포트 번호를 사용
NAT는 주로 IP 주소를 변환하고 네트워크 내에서 포트번호를 관리하여 여러 장치가 하나의 공용 IP 주소를 공유할 수 있게 해주는 기술
여기에서 NAT는 포트 번호를 사용해서 내부 네트워크와 외부 네트워크 간의 연결을 관리하고, 포트 주소 변환(PAT)가 작동됩니다.
내부 IP와 포트 매핑: 내부 네트워크의 장치가 인터넷과 같은 외부 네트워크에 통신할 때, NAT 장치는 내부 장치의 사설 IP 주소와 포트 번호를 공용 IP 주소와 새로운 포트 번호로 변환한다. 이때 사용되는 공용 IP 주소와 포트 번호의 조합은 NAT 장치가 내부 장치와 외부 장치 간의 연결을 식별하는데 사용
변환 테이블 유지: NAT 장치는 내부 IP 주소, 포트 번호, 그리고 외부 공용 IP 주소, 포트 번호 간의 매핑 정보를 저장하는 테이블을 유지해서 응답 패킷이 올바른 내부 장치로 전달될 수 있게 한다
포트 번호 재사용: NAT 장치는 여러 내부 장치가 동일한 공용 IP 주소를 사용할 수 있게 해주고, 내부 장치가 사용 중인 포트 번호와 공용 IP 주소의 포트 번호 조합으로 연결을 구분
TCP와 UDP는 전송 계층에서 데이터 전송을 담당하는 두 가지 주요 프로토콜로 데이터 전송의 신뢰성, 순서 보장 및 흐름 제어를 다루는 방식에서 큰 차이를 보인다.
TCP의 특징은
1. 연결 지향: TCP는 데이터 전송을 시작하기 전에 송신자와 수신자 간에 3-way handshake를 통해 연결을 설정
2. 신뢰성: TCP는 데이터의 전송이 성공적으로 완료되었는지 확인한다. 데이터의 손실, 오류, 중복 등을 감지하고 필요한 경우 재전송한다
3. 순서 보장: TCP는 데이터가 송신된 순서대로 수신될 수 있도록 보장. 데이터의 패킷이 순서대로 재조립
4. 흐름 제어: 수신자의 버퍼가 넘치지 않도록 송신자가 데이터 전송 속도를 조절.
5. 혼잡 제어: 네트워크 혼잡 상황을 감지하고 데이터 전송 속도를 조절하여 네트워크 과부하르 ㄹ방지
TCP 세그먼트 구조
UDP의 특징은
1. 비연결 지향: UDP는 데이터 전송 전에 연결 설정이 필요 없다. 각 데이터그램이 독립적으로 처리
2. 신뢰성 없음: UDP는 데이터 전송의 성공 여부를 보장하지 않는다
3. 순서 보장 없음: 데이터그램이 전송된 순서대로 수신되지 않을 수 있다
4. 흐름 제어 없음: 수신자의 버퍼 상태를 모니터링하거나 조절하지 않는다
5. 혼잡 제어 없음: 네트워크 혼잡 상태를 감지하거나 조절하지 않는다
UDP 데이터그램의 구조는 TCp 세그먼트의 구조에 비해 매우 간단하다
결론적으로
TCP는 신뢰성있는 데이터 전송을 보장하며, 데이터의 순서, 흐름 제어, 혼잡 제어를 제공.
UDP는 간단하고 빠른 데이터 전송을 제공하지만 신뢰성, 순서 보장, 흐름 제어, 혼잡 제어 기능이 없다
TCP는 신뢰성이 중요한 애플리케이션에서 사용
UDP는 속도가 중요한 애플리케이션에서 사용