L4 Transport layer

JooH·2025년 2월 24일

네트워크

목록 보기
6/15

Transport Layer의 역할 : 데이터 패킷이 순서대로 받아지고, 데이터가 손실되거나 손상되지 않도록 보장하는 역할을 함. 데이터 패킷이 손상된 경우 해당 계층은 송신자에게 패킷 재전송을 요청할 수 있음. IP 네트워크에서는 이를 각 데이터그램에 추가 정보를 포함하는 추가 헤더를 추가해서 구현한다.

Transport Layer의 두가지 주요 프로토콜
1) Transmission Control Protocol : 높은 오버헤드 프로토콜로 손실된 데이터나 손상된 데이터의 재전송 및 전송된 바이트의 순서대로 전달을 허용
2) User Datagram Protocol : 수신자는 손상된 패킷을 감지할 수 있지만, 패킷이 순차적으로 (올바른 순서로, 혹은 전달되는것을) 보장하지 않음. 하지만 빠르죠?

TCP : 신뢰성 있음
UDP : 신뢰성 없음


UDP :

  • checksum 정도만 제공한다 (보내는 패킷의 데이터가 전송 도중에 잘못되었는지만 체크)
  • 별 다른 기능이 없으므로 TCP에 비해 상대적으로 빠를 수 있다.
  • 언제 사용하면 좋을까?


TCP :

  • 세그먼트가 목적지에 도달하면, OS는 목적지 포트번호로 어플리케이션(프로세스)를 식별한다

Well-Known 포트

  • 같은 작업을 하는 서버가 매번 다른 포트를 사용하면 통신하기 어려움
  • 프로토콜에 고정 포트번호를 부여하는게 그런 이유다 (의무는 아님)
    ex) http 80, dns 53, smtp 25

TCP의 필드들을 보면 다음과 같은 필드들은 신뢰성을 보장하기 위해 존재한다

  • sequence number : 순서번호
  • Acknowledge Number : 어디까지 받았는지, 다음번 전송 패킷의 Sequence Number를 응답한다
  • Flags, ACK, RST, SYN, FIN, Window Size

TCP 커넥션 맺기 : 3 Way Handshake

  • 통신하기 위해 데이터 전송 전 상호 연결을 수립하는 과정
  • 상대방과 논리적 세션을 맺는 시작점으로 해당 과정을 거친 뒤 데이터들을 정상적으로 송수신 함
  • 데이터를 전송할 준비가 되었다는 보장 및 데이터 전송 준비 확인
  • 세션을 맺지 못할 시 통신 중단됨

1) 서버는 TCP 포트를 열고 연결 요청을 대기하고 있음 (listen)
2) Client가 Server에게 연결을 요청하는 SYN 패킷을 전송, 임의의 값 SEQ(100)넘버를 함께 전송
3) SYN 패킷을 받은 서버가 요청을 수락하면, SYN + ACK 패킷을 전송하며 응답한다

  • 임의의 값 seq(200) 전달
  • 해당 패킷의 응답의 의미로 Client에게 전달받은 Seq(100) + 1을 한 ACK (101) 전달

4) Server로 부터 SYN+ACK 응답을 받아 Client는 연결이 수립된 상태이다

  • 다시 Server에게 ACK 로 연결 수립 완료 패킷을 전달한다
  • 이전에 보낸 Seq(100) +1을 하여 새로운 seq(101) 숫자를 전송한다
  • 해당 패킷의 응답이라는 표시로 Server로 받은 seq(200) + 1을 하여 ack(201) 넘버 전달

5) Established

  • Client로 부터 연결 수립이 되었다는 ACK 패킷을 전달받아 server도 연결 수립상태로 전환한다
  • 서버와 클라이언트 모두 Established 모드가 된 후 데이터 송수신이 이루어 진다

TCP 커넥션 끊기 : 4 way handshake

  • 연결을 해제하는 과정으로, FIN 플래그를 사용한다
  • FIN : 세선을 종료하는데 사용하며, 더 이상 보낼 데이터가 없음을 나타냄

Termination 의 종류
1) Graceful Connection Release (정상적인 연결 해제)

  • 양쪽 커넥션이 서로 커넥션을 닫을 때 까지 연결되어 있음
  • 4-Way Handshake

2) Abrupt Connection Release (갑작스런 연결 해제)

  • 갑자기 한 TCP entity가 연결을 강제로 닫음
  • 한 사용자가 두 데이터 전송 방향을 모두 닫음
  • RST(reset)을 통한 연결 해제

4 way handshake (클라이언트 - 서버라고 했지만 클라이언트-클라이언트도 가능하다)

1) 클라이언트에서 서버와 연결 종료를 위해 서버에 FIN 패킷(실질적인 ACK 포함됨)을 보내고 FIN_WAIT_1 상태가 됨(서버가 먼저 끊을 수 있다)
2) 서버는 FIN을 클라이언트로부터 받고, 응답 패킷 ACK 를 보냄 (상태 : CLOSE_WAIT)
3) 서버가 통신이 끝나면 클라이언트에게 FIN 패킷을 보내고 LAST_WAIT 상태가 됨
4) 클라이언트는 확인 패킷 ACK 를 보내고 TIME_WAIT 상태가 된다

해당 과정을 통해 서버-클라이언트는 안전하게 연결을 종료하게 된다.

연결 수립과 종료의 단계가 차이나는 이유는, 클라이언트가 데이터 전송을 마쳤다 해도 서버가 아직 보낼 데이터가 남아있을 수 있기 때문에 일단 FIN에 대한 ACK만 보내고, 데이터를 모두 전송한 뒤에 FIN을 보내기 때문이다

0개의 댓글