HTTP

[HTTP] 트랜스포트 계층

날아 2023. 1. 31. 00:27

1. 트랜스포트 계층의 역할

트랜스포트 계층의 역할은 수신지의 애플리케이션에 데이터를 전달하는 것이다.

할당된 포트 번호를 참고하여 데이터를 애플리케이션에 전달한다.

  • TCP : 수신지에 데이터가 정확하게 전달되도록 전송 속도를 조절하거나 도달하지 않은 데이터를 재전송한다.
  • UDP : VoIP나 동영상 스트리밍 서비스와 같이 실시간 통신이 필요하다면 전송속도를 중시하는 UDP사용. 별다른 처리를 하지 않는 대신 전송속도가 빠르다.

2. TCP가 정확하게 데이터를 전달하는 방법 

  • TCP는 데이터 전송에 신뢰성을 더하기 위해 데이터를 세그먼트 단위로 분할하고, 전송 속도를 조정하며, 데이터가 제대로 전달되지 않았을 경우 재전송을 한다.
  • TCP의 세그먼트는 데이터 본체에 TCP 헤더가 붙은 형태로 구성된다. TCP 헤더에는 포트번호나 일련번호와 같은 정보가 포함되어 있다. 

 

컨트롤 비트

현재의 통신 상태를 표현하는 플래그 역할

  • SYN : 접속을 시작할 때 ON으로 설정
  • ACK : 이전 동작을 확인했다는 것을 알려준다. 확인 응답 번호와 조합해서 사용된다.
  • CWR : 통신 경로가 혼잡해서 전송량을 줄여줄 것을 알려준다.
  • ECE : 통신 경로가 혼잡해서 수신할 수 없을 수도 있다는 것을 알려준다.
  • FIN : 데이터 송신이 완료되어 통신을 종료하고 싶다는 것을 알려준다.

 

통신 개시부터 통신 종료까지의 흐름
  • 커넥션을 맺는 과정은 3단계로 진행되기 때문에 이것을 3way handshake라고 부른다. 

  • 커넥션을 종료할 때는 4way handshake가 일어난다. 

 

Time - Wait
  • 먼저 연결을 끊는 (active closer) 쪽에 생성되는 소켓으로, 혹시 모를 패킷 전송 실패에 대비하기 위하여 존재하는 소켓이다.
  • Time-Wait가 없다면 패킷의 손실이 발생하거나 통신자 간 연결 해제가 제대로 이루어지지 않을 수 있다.
  • Ex) 클라이언트가 마지막으로 보낸 ACK를 서버가 받지 못했을 경우
    1. 서버가 FIN 메시지 전송
    2. 클라이언트가 수신 후 ACK 메시지 전송 후, 통신 끊음 (Time-wait X)
    3. 서버가 ACK를 수신하지 못함
    4. 일정 시간 후, ACK를 수신하지 못한 서버가 다시 FIN 메시지 전송.
    5. 클라이언트는 이미 Closed 상태이기 때문에 FIN 메시지 수신 불가
    6. TCP 통신이 제대로 끊기지 않음

 

데이터 전송 과정 
  • 일련번호와 최대 세그먼트 크기(MSS)는 사전에 조율한다. (클라이언트와 서버가 제시한 MSS의 크기가 다를 경우 작은 값을 따라간다.)
  • 커넥션을 맺는 과정에서 일련번호는 1씩 증가한다. 

 

송신 실패 여부를 확인 
  • 서버에서 데이터를 보냈는데 중간에 데이터가 전달되지 않았을 경우, 클라이언트는 응답을 할 수 없다.
  • 그럴 경우 서버에서 다시 이전에 응답받은 후부터의 데이터를 다시 보낸다.
  • 연속된 데이터를 몰아서 보내면 전송속도가 빨라진다. 
    • 서버가 클라이언트의 응답이 오지 않은 상태에서 데이터를 계속 보내는 것.
    • 이 경우, 동일한 확인 응답 번호가 세 번 연속으로 들어오면 전송이 실패한 것으로 간주한다.

 

한 번에 받을 수 있는 데이터 크기를 통보
  • 수신 측은 수신한 데이터를 일시적으로 보관할 수 있는 버퍼라는 저장 영역을 가지고 있다.
  • 수신 측은 TCP 헤더의 (윈도우) 사이즈에 이 버퍼의 크기를 설정하고 송신 측에 통보.
클라이언트 : (윈도우)사이즈는 4000바이트 입니다.
서버 : MSS가 1000바이트이므로 4개까지 몰아서 보낼 수 있겠다.
  • 수신측은 응답을 보낼 때 윈도우 사이즈를 설정하여 현재 어느정도까지 수신할 수 있는지 수시로 알려준다. 이런 과정을 흐름 제어라고 한다. 

  • 버퍼가 가득 차면 (윈도우) 사이즈가 0으로 설정되고 데이터 전송은 일단 멈춘다. 
  • 다시 전송을 재개할 시점을 알기 위해 송신(서버) 측은 탐색 패킷 혹은 윈도우 프로브라고 하는 패킷을 수신측에 보낸다.
  • 패킷 누락이 발생하면 누락된 이후의 모든 패킷을 재전송해야한다.
  • 이때 누락된 패킷만 재전송하는 방법도 있는데, 이것을 선택적 확인 응답(SACK)이라 한다.
  • 이는 송수신 측 모두 이것을 지원해야 사용할 수 있다. 

3. UDP가 고속으로 데이터를 전달하는 방법

  • UDP는 다른 처리 없이 전송만 한다.
  • 애플리케이션에서 추가 작업 필요