L4 전송 계층
전송 계층
- 송신자의 프로세스와 수신자의 프로세스 간의 연결을 제공한다.
- 이전까지의 네트워크 환경은 기본적으로 비신뢰성 환경이다.
- 데이터가 전송 중에 유실되거나 손상될 수도 있다.
- 신뢰성 있는 전송을 할 수 있게 해주는 것이 전송 계층이다.
- 연결지향과 신뢰성, 정확성의 TCP와
- 비연결지향과 효율성의 UDP가 있다.
포트
- 특정 프로세스를 나타내는 주소이다.
- 하나의 포트는 하나의 프로세스만이 사용이 가능하다.
- 반대로 하나의 프로세스가 여러개의 포트를 사용할 수는 있다.
- 0 ~ 65535의 범위를 가질 수 있다.
- 포트 번호는 세 가지로 나눌 수 있다.
- 0 ~ 1023 : well-known port
- 1024 ~ 49151 : registered port
- 49152 ~ 65535 : dynamic port
- well-known port
- 0 ~ 1023
- 특정한 애플리케이션을 위해서 정해진 포트 번호이다.
- 강제적인 것이 아니다.
well-known port | |
---|---|
FTP | 20, 21 |
SSH | 22 |
TELNET | 23 |
DNS | 53 |
DHCP | 67, 68 |
TFTP | 69 |
HTTP | 80 |
HTTPS | 443 |
- registered port
- 1024 ~ 49151
- 특정 서비스로 인해 등록된 포트 번호이다.
- 역시 강제적인 것은 아니다.
registered port | |
---|---|
MySQL | 3306 |
HTTP 대체 | 8080 |
- dynamic port
- 49152 ~ 65535
- 어느 프로그램에서나 사용할 수 있는 포트 번호이다.
만약 내 크롬과 네이버가 통신을 한다고 하면,
- 네이버 서버는 80포트를 사용하고, 내 크롬은 60000 포트를 사용한다.
- 크롬으로 네이버 스포츠를 띄우면 (네이버 ip의 80포트로 스포츠 요청을 보내면)
- 네이버는 내 ip의 60000번 포트로 스포츠 응답을 보낸다.
- 내 60000번 크롬에 네이버 스포츠 화면이 뜬다.
- 내가 크롬을 하나 더 띄웠다고 할 때 걔는 50000번 포트를 사용한다.
- 50000번 크롬으로 네이버 뉴스를 띄우면 (네이버 ip의 80포트로 뉴스 요청을 보내면)
- 네이버는 내 ip의 50000번 포트로 뉴스 응답을 보낸다.
- 50000번 크롬은 네이버 뉴스를 띄운다.
- 나는 크롬을 두 개 띄워놨지만, 걔네는 서로 다른 화면을 보여주고 있다.
- 50000번 크롬이 네이버에게 요청을 보냈을 때, 60000번 크롬에게는 아무 영향도 없었다.
- 같은 크롬을 두 개 띄웠음에도 서로 영향을 주지 않고 정확한 결과를 보여줬다.
- 네이버의 응답이 포트 번호를 보고 잘 찾아갔기 때문이다.
세그먼트
- L4의 PDU이다.
- TCP는 복잡하고 길고
- UDP는 단순한 모양을 갖는다.
- 얘네 모양은 뒤에 각각의 차례에 살펴본다.
UDP
- User Datagram Protocol
- 또는 Universal Datagram Protocol이라고도 한다.
- 비연결지향형
- 데이터를 전송하기 전에 연결의 과정이 따로 없기 때문에,
- 브로드캐스팅에 적합하다.
- 비신뢰성
- 전송 방식이 매우 단순하다.
- 그래서 서비스의 신뢰성이 낮다.
- 데이터그램의 도착 순서가 보장되지 않고,
- 데이터그램의 중복이 있을 수도 있고,
- 통보 없이 데이터그램의 누락이 있을 수도 있다.
- 그래서 속도가 빠르다.
- 일반적으로 오류의 수정이나 검증이 필요없는 경우에 많이 쓰인다.
- Source Port
- 출발지 포트 번호
- Destination Port
- 도착지 포트 번호
- Length
- UDP 헤더의 길이 + 뒤의 페이로드 길이
- Checksum
- 역시 오류를 체크하기 위한 값
TCP
- Transmission Control Protocol
- 연결지향형
- 신뢰성
- UDP에 비해 기능도 많고 복잡하다.
- 에러 제어, 흐름 제어, 혼잡 제어
- 안정적인 통신을 지향한다.
- 데이터를 안정적이고,
- 데이터의 순서를 보장하고,
- 에러 없이 통신할 수 있게 한다.
- UDP보다 상대적으로 느리다.
- UDP에 비해 기능도 많고 복잡하다.
- Source Port
- 출발지 포트 번호
- Destination Port
- 도착지 포트 번호
Sequence Number
Acknowledgment Number
- Offset
- 헤더의 길이를 나타낸다.
- IP랑 마찬가지로 4로 나눠서 값의 위치를 적는다.
- Reserved
- 미래를 위해 예약된 필드
- 사용되지 않음
- TCP flags
- TCP 헤더가 어떤 기능을 수행하는 지를 나타내는 플래그이다.
- C E U A P R S F 8개가 있지만,
- 보통 U A P R S F만 사용한다고 한다.
- Window
- 데이터를 얼만큼 보내줘도 되는지 알리기 위한 용도
- 아래에서 window에 대해 자세한 설명을 한다.
- Checksum
- 오류를 확인하기 위한 값
- Urgent Pointer
- TCP Options
- 추가 정인 옵션들
- 0~10개까지 붙을 수 있다. (4바이트씩)
TCP flags
- URG
- 긴급 비트
- 긴급 데이터라고 알리는 용도
- 송신 측에서 얘를 1로 채워서 보내면,
- 정해진 순서와 상관없이 이 데이터를 먼저 송신한다.
- ACK
- 승인 비트
- Acknowledgement Number 얘가 유효한지 아닌지를 알리는 용도이다.
- 승인 비트가 1이면, Acknowledgement Number가 유효하다.
- 0이면, Acknowledgement Number가 유효하지 않다. (무시됨)
- PSH
- 푸쉬 비트
- 버퍼링된 데이터를 바로 상위 계층으로 푸쉬하는 용도이다.
- 수신 측의 버퍼가 가득 차지 않았을 때,
- 푸쉬 비트가 1로 설정된 패킷이 날라왔다.
- 그럼 버퍼를 바로 푸쉬한다.
- RST
- 초기화 비트
- 강제 연결 초기화의 용도이다.
- 연결 상의 문제가 발생되었을 때 연결을 강제 초기화 한다.
- SYN
- 동기화 비트
- 연결 시작의 용도이다.
- 송수신 간의 Sequence Number의 동기화
- FIN
- 종료 비트
- 연결 해제의 용도이다.
- 송수신 간의 데이터 전송이 모두 끝나서 종료하고 싶을 때 사용된다.
3-way handshake
- 프로세스와 프로세스 간에 TCP를 사용해서 통신을 할 때, 가장 먼저 수행되는 연결 과정이다.
- 클라이언트가 서버에 요청 패킷을 보내고
- SYN
- 서버가 요청을 수락하는 패킷을 보내고
- SYN + ACK
- 클라이언트가 최종적으로 수락하는 패킷을 보낸다.
- ACK
- 클라이언트가 서버에 요청 패킷을 보내고
- 이 과정을 Three way handshake라고 하고, 얘가 끝나면 그 뒤에 데이터 통신이 이뤄진다.
4-way handshake
- 프로세스 간의 통신이 모두 끝나고, 연결을 종료하는 과정이다.
- 클라이언트가 서버에게 연결 종료를 요청한다.
- FIN
- 서버가 연결 종료 요청에 대한 응답을 보낸다.
- ACK
- 이번엔 서버가 연결 종료 요청을 보낸다.
- FIN
- 클라이언트도 연결 종료 요청에 대한 응답을 보낸다.
- ACK
- 클라이언트가 서버에게 연결 종료를 요청한다.
This post is licensed under CC BY 4.0 by the author.