전송 계층은 TCP, UDP가 대표적이며,
애플리케이션 계층에서 받은 메시지를 기반으로
세그먼트 또는 데이터그램으로 데이터를 쪼개고
데이터가 오류 없이 순서대로 전달되도록 도움을 주는 계층이다.
TCP(Transmission Control Protocol)
- 가상 회선 패킷 교환 방식: 데이터의 순서가 지켜진다.
- 오류 검사 메커니즘
- 재전송: 시간 초과되면 서버는 전달되지 않은 데이터에 대해 재전송을 시도한다.
- 체크섬: 체크섬을 통해 무결성을 평가한다. 즉, 송신된 데이터의 체크섬과 수신된 데이터의 체크섬 값을 비교하여 올바르게 전달되었는지 확인한다.
- 헤더: 20~60바이트로 가변적이다.
UDP(User Datagram Protocol)
- 데이터 그램 패킷 교환 방식: 순서가 지켜지지 않는다.
- 오류검사: 단순한 체크섬만 지원한다.
- 헤더: 8바이트 고정 길이
TCP vs UDP
둘의 비교는 기술 면접 단골 질문이니 외워두자.
TCP (전송 제어 프로토콜) |
UDP (데이터그램 프로토콜) |
|
패킷 교환 방식 | 가상 회선 패킷 교환 방식 | 데이터그램 패킷 교환 방식 |
신뢰성 | O | X |
오류 검사 | 재전송, 체크섬 | 체크섬 |
패킷의 순서 보장 | O | X |
헤더 길이 | 20~60 바이트 가변 길이 | 8 바이트 고정 길이 |
연결 보장 | 연결을 보장함. 3-웨이 핸드셰이크로 연결을 맺고, 4-웨이 핸드셰이크로 연결을 해제하는 작업 필요. |
연결 보장하지 않음. 그냥 데이터를 보냄. 연결을 유지하고 해지는 데 드는 비용이 없음. |
브로드캐스트 지원 | X | O |
속도 | 느림 | 빠름 |
3-웨이 핸드셰이크(3-way handshake)
TCP의 연결 성립은 3개의 과정을 거친다.
- SYN 단계: 클라이언트는 서버에 클라이언트의 ISN을 담아 SYN을 보낸다.
- SYN + ACK 단계: 서버는 클라이언트의 SYN을 수신하고 서버의 ISN을 보내며 승인번호로 클라이언트의 ISN + 1을 보낸다.
- ACK 단계: 클라이언트는 서버의 ISN + 1 값인 승인번호를 담아 ACK를 서버에 보낸다.
- ISN: TCP 기반 데이터 통신에서 각각의 새 연결에 할당된 고유한 32비트 시퀀스 번호. TCP 연결을 통해 전송되는 다른 데이터 바이트와 충돌하지 않는 시퀀스 번호를 할당하는 데 도움이 된다.
- SYN: synchronization, 연결 요청 플래그
- ACK: acknowledgement, 응답 플래그
*클라이언트와 서버의 상태
TCP 연결을 하면서 클라이언트는 closed, syn-sent, established 상태가 되며,
서버는 closed, listen, syn-received, established 상태가 된다.
이러한 서버와 클라이언트 간의 연결 설정 과정 덕분에 TCP는 신뢰성을 가진다.
이러한 과정이 없는 UDP는 신뢰성이 없다.
*listen
listen은 서버가 클라이언트의 요청을 기다리는 상태로 이를 기반으로 서버 메서드의 이름이 결정된다.
아래는 node.js에서 서버를 listen 상태로 만드는 코드의 예시이다.
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
4-웨이 핸드셰이크(4-way handshake)
TCP의 연결 해제 과정은 아래의 4개 과정으로 이루어진다.
- 클라이언트가 연결을 닫으려고 할 때 FIN으로 설정된 세그먼트를 보낸다. 이후 클라이언트는 FIN_WAIT_1 상태로 들어가 서버의 응답을 기다린다.
- 서버는 클라이언트에게 ACK라는 승인 세그먼트를 보내고, CLOSE_WAIT 상태에 들어간다. 클라이언트는 세그먼트를 받으면 FIN_WIAT_2 상태에 들어간다.
- 서버는 LAST_ACK 상태가 되어 일정 시간 이후에 클라이언트에 FIN이라는 세그먼트를 보낸다.
- 클라이언트는 TIME_WAIT 상태가 되고, 다시 서버로 ACK를 보내서 서버는 CLOSED 상태가 되며, 이후 클라이언트는 어느 정도의 시간 (TIME_WAIT으로 설정된 시간)을 대기한 후 연결을 닫는다.
*TIME_WAIT
TIME_WAIT는 지연 패킷 등이 발생했을 때 데이터 무결성(일관성, 정확성)을 위해 패킷을 기다리는 시간을 말한다.
2*MSL(maximum segment lifetime, 최대 패킷 수명) 동안 기다린다.
또한, 연결이 올바르게 닫힌 사앹로 만들기 위해 존재하기도 한다.
예를 들어, CLOSED가 아닌 LAST_ACK 상태로 되어 있다면
그 다음 연결 때 오류가 나기 때문에 일정시간 기다리는 TIME_WAIT가 필요하다.
이는 OS마다 기다리는 시간이 다른데, CentOS6, 우분투에는 60초로 설정되고 있고,
윈도우는 4분으로 설정되어 있다.
참고: inflearn 강의 'CS 지식의 정석 - 큰돌'
'컴퓨터 공학 & 통신' 카테고리의 다른 글
[개념 정리/네트워크] 라우팅 (0) | 2023.07.12 |
---|---|
[개념 정리/네트워크] TCP/IP 4계층 - 인터넷 계층 (1) | 2023.07.11 |
[개념 정리/네트워크] TCP/IP 4계층 - 애플리케이션 계층 (0) | 2023.07.11 |
[개념 정리] 네트워크 - TCP/IP 4계층 (0) | 2023.07.11 |
[개념 정리/네트워크] 네트워크 통신의 종류와 네트워크의 분류 (0) | 2023.07.06 |