컴퓨터 공학 & 통신

[개념 정리/네트워크] TCP/IP 4계층 - 전송 계층

왈왈디 2023. 7. 11. 16:33
728x90

전송 계층은 TCP, UDP가 대표적이며, 

애플리케이션 계층에서 받은 메시지를 기반으로

세그먼트 또는 데이터그램으로 데이터를 쪼개고

데이터가 오류 없이 순서대로 전달되도록 도움을 주는 계층이다.

 

TCP(Transmission Control Protocol)

  • 가상 회선 패킷 교환 방식: 데이터의 순서가 지켜진다.
  • 오류 검사 메커니즘
    1.  재전송: 시간 초과되면 서버는 전달되지 않은 데이터에 대해 재전송을 시도한다.
    2. 체크섬: 체크섬을 통해 무결성을 평가한다. 즉, 송신된 데이터의 체크섬과 수신된 데이터의 체크섬 값을 비교하여 올바르게 전달되었는지 확인한다.
  • 헤더: 20~60바이트로 가변적이다.

TCP Header

 

UDP(User Datagram Protocol)

  • 데이터 그램 패킷 교환 방식: 순서가 지켜지지 않는다.
  • 오류검사: 단순한 체크섬만 지원한다.
  • 헤더: 8바이트 고정 길이

UDP Header

 

TCP vs UDP

둘의 비교는 기술 면접 단골 질문이니 외워두자.

  TCP
(전송 제어 프로토콜)
UDP
(데이터그램 프로토콜)
패킷 교환 방식 가상 회선 패킷 교환 방식 데이터그램 패킷 교환 방식
신뢰성 O X
오류 검사 재전송, 체크섬 체크섬
패킷의 순서 보장 O X
헤더 길이 20~60 바이트 가변 길이 8 바이트 고정 길이
연결 보장 연결을 보장함.
3-웨이 핸드셰이크로 연결을 맺고, 4-웨이 핸드셰이크로 연결을 해제하는 작업 필요.
연결 보장하지 않음.
그냥 데이터를 보냄.
연결을 유지하고 해지는 데 드는 비용이 없음.
브로드캐스트 지원 X O
속도 느림 빠름

 

3-웨이 핸드셰이크(3-way handshake)

TCP의 연결 성립은 3개의 과정을 거친다.

  1. SYN 단계: 클라이언트는 서버에 클라이언트의 ISN을 담아 SYN을 보낸다.
  2. SYN + ACK 단계: 서버는 클라이언트의 SYN을 수신하고 서버의 ISN을 보내며 승인번호로 클라이언트의 ISN + 1을 보낸다.
  3. ACK 단계: 클라이언트는 서버의 ISN + 1 값인 승인번호를 담아 ACK를 서버에 보낸다.

  • ISN: TCP 기반 데이터 통신에서 각각의 새 연결에 할당된 고유한 32비트 시퀀스 번호. TCP 연결을 통해 전송되는 다른 데이터 바이트와 충돌하지 않는 시퀀스 번호를 할당하는 데 도움이 된다.
  • SYN: synchronization, 연결 요청 플래그
  • ACK: acknowledgement, 응답 플래그

*클라이언트와 서버의 상태

TCP 연결을 하면서 클라이언트closed, syn-sent, established 상태가 되며,

서버closed, listen, syn-received, established 상태가 된다.

이미지 출처: nflearn 강의   'CS 지식의 정석   - 큰돌' 강의 자료

이러한 서버와 클라이언트 간의 연결 설정 과정 덕분에 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개 과정으로 이루어진다.

  1. 클라이언트가 연결을 닫으려고 할 때 FIN으로 설정된 세그먼트를 보낸다. 이후 클라이언트는 FIN_WAIT_1 상태로 들어가 서버의 응답을 기다린다.
  2. 서버는 클라이언트에게 ACK라는 승인 세그먼트를 보내고, CLOSE_WAIT 상태에 들어간다. 클라이언트는 세그먼트를 받으면 FIN_WIAT_2 상태에 들어간다.
  3. 서버는 LAST_ACK 상태가 되어 일정 시간 이후에 클라이언트에 FIN이라는 세그먼트를 보낸다.
  4. 클라이언트는 TIME_WAIT 상태가 되고, 다시 서버로 ACK를 보내서 서버는 CLOSED 상태가 되며, 이후 클라이언트는 어느 정도의 시간 (TIME_WAIT으로 설정된 시간)을 대기한 후 연결을 닫는다.

4-웨이 핸드셰이크

*TIME_WAIT

TIME_WAIT는 지연 패킷 등이 발생했을 때 데이터 무결성(일관성, 정확성)을 위해 패킷을 기다리는 시간을 말한다.

2*MSL(maximum segment lifetime, 최대 패킷 수명) 동안 기다린다.

 

또한, 연결이 올바르게 닫힌 사앹로 만들기 위해 존재하기도 한다.

예를 들어, CLOSED가 아닌 LAST_ACK 상태로 되어 있다면

그 다음 연결 때 오류가 나기 때문에 일정시간 기다리는 TIME_WAIT가 필요하다.

이는 OS마다 기다리는 시간이 다른데, CentOS6, 우분투에는 60초로 설정되고 있고,

윈도우는 4분으로 설정되어 있다.

 

참고: inflearn 강의 'CS 지식의 정석 - 큰돌'

728x90