제육's 휘발성 코딩
반응형

전송 계층

전송 계층은 송신자와 수신자를 연결하는 통신 서비스를 제공하며, 데이터 통신을 위한 스트림, 흐름 제어 등을 제공한다. 대표적으로 TCP, UDP가 있다.

TCP

TCP는 연결형, 신뢰성 전송 프로토콜로 두 호스트의 전송 계층 사이에 논리적 연결을 설립한다. 그 후 데이터 전송을 완료하면 연결을 해제하는 방식으로 connection setup(3-way handshaking), data transfer(데이터 전송), connection termination(4-way handshaking)의 세 단계를 거친다.

 

신뢰성 있는 서비스를 제공하기 때문에 데이터 스트림을 순차적으로 손실없이 전송하는 것(가상 회선)을 보장한다. 이를 가능하게 하는 방법에는 오류제어, 흐름제어, 혼잡제어 등이 있다.

흐름제어 : 데이터를 보내는 속도와 데이터를 받는 속도의 균형을 잡는 것 (Stop And Wait, Sliding Window 기법 사용)

오류제어 : TCP Header의 checksum, 확인 응답, 타임아웃 등을 통해 훼손된 segment 감지 및 재전송, 손실된 segment의 재전송, 순서에 맞지 않게 도착한 segment를 정렬 등의 역할 수행

혼잡 제어 : 송신 측에서 라우터가 처리할 수 있는 양을 판단하고 전송 속도를 적절히 조절하여 혼잡을 제어한다. (AIMD, Slow Start 등)

 

3-Way HandShake

다음 과정과 같이 Connection setup을 위해 3-Way HandShake 과정을 거쳐 신뢰성이 구축되고, 데이터 전송을 시작한다.

image

  • SYN 단계 :클라이언트는 서버에 클라이언트의 ISN을 담아 SYN을 보낸다. ISN은 새로운 TCP 연결의 첫 번째 패킷에 할당된 임의의 시퀸스 번호를 말한다.
  • SYN + ACK 단계 : 서버는 클라이언트의 SYN을 수신하고 서버의 ISN을 보며 승인번호로 ISN + 1을 보낸다.
  • ACK 단계 : 클라이언트는 서버의 ISN + 1한 값인 승인번호를 담아 ACK를 서버에 보낸다.

 

4-Way HandShake

다음 과정과 같이 Connection termination을 위해 4-Way HandShake가 발생한다.

image

  • FIN 단계 : 클라이언트가 연결을 닫을 때 FIN으로 설정된 세그먼트를 보낸다. (FIN_WAIT_1 상태)
  • ACK 단계 : 서버는 클라이언트로 부터 ACK라는 승인 세그먼트를 보내고 CLOSE_WAIT 상태에 들어간다. 클라이언트는 해당 세그먼트를 받으면 FIN_WAIT_2 상태가 된다. 이 때 데이터 통신 중인 것이 남아있을 수 있다.
  • FIN 단계 : 모든 작업이 끝나면 FIN 세그먼트를 클라이언트에게 보낸다.
  • ACK 단계 : 클라이언트는 TIME_WAIT 상태가 되고 서버는 CLOSED 상태가 된다.

 

UDP

UDP는 비연결형, 비신뢰성 전송 프로토콜로 논리적 연결을 설립하지 않고 datagram을 전송하는 비연결형 프로토콜이다. 또한, 흐름제어, 혼잡 제어를 제공하지 않아 간단하며 작은 메시지나 신뢰성을 크게 고려하지 않아도 되는 상황에서 사용한다.

파일 다운로드와 같이 중간에 데이터가 손실되면 안되는 중요한 사항은 TCP를 사용하고 동영상 스트리밍과 같이 훼손된 데이터를 무시하고 나머지 패킷을 계속받아도 사용자가 인식하지 못하는 즉, 신뢰성보다 실시간성이 중요한 부분에는 UDP를 사용한다.

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^