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를 서버가 받지 못했을 경우
- 서버가 FIN 메시지 전송
- 클라이언트가 수신 후 ACK 메시지 전송 후, 통신 끊음 (Time-wait X)
- 서버가 ACK를 수신하지 못함
- 일정 시간 후, ACK를 수신하지 못한 서버가 다시 FIN 메시지 전송.
- 클라이언트는 이미 Closed 상태이기 때문에 FIN 메시지 수신 불가
- TCP 통신이 제대로 끊기지 않음
데이터 전송 과정
- 일련번호와 최대 세그먼트 크기(MSS)는 사전에 조율한다. (클라이언트와 서버가 제시한 MSS의 크기가 다를 경우 작은 값을 따라간다.)
- 커넥션을 맺는 과정에서 일련번호는 1씩 증가한다.
송신 실패 여부를 확인
- 서버에서 데이터를 보냈는데 중간에 데이터가 전달되지 않았을 경우, 클라이언트는 응답을 할 수 없다.
- 그럴 경우 서버에서 다시 이전에 응답받은 후부터의 데이터를 다시 보낸다.
- 연속된 데이터를 몰아서 보내면 전송속도가 빨라진다.
- 서버가 클라이언트의 응답이 오지 않은 상태에서 데이터를 계속 보내는 것.
- 이 경우, 동일한 확인 응답 번호가 세 번 연속으로 들어오면 전송이 실패한 것으로 간주한다.
한 번에 받을 수 있는 데이터 크기를 통보
- 수신 측은 수신한 데이터를 일시적으로 보관할 수 있는 버퍼라는 저장 영역을 가지고 있다.
- 수신 측은 TCP 헤더의 (윈도우) 사이즈에 이 버퍼의 크기를 설정하고 송신 측에 통보.
클라이언트 : (윈도우)사이즈는 4000바이트 입니다.
서버 : MSS가 1000바이트이므로 4개까지 몰아서 보낼 수 있겠다.
- 수신측은 응답을 보낼 때 윈도우 사이즈를 설정하여 현재 어느정도까지 수신할 수 있는지 수시로 알려준다. 이런 과정을 흐름 제어라고 한다.
- 버퍼가 가득 차면 (윈도우) 사이즈가 0으로 설정되고 데이터 전송은 일단 멈춘다.
- 다시 전송을 재개할 시점을 알기 위해 송신(서버) 측은 탐색 패킷 혹은 윈도우 프로브라고 하는 패킷을 수신측에 보낸다.
- 패킷 누락이 발생하면 누락된 이후의 모든 패킷을 재전송해야한다.
- 이때 누락된 패킷만 재전송하는 방법도 있는데, 이것을 선택적 확인 응답(SACK)이라 한다.
- 이는 송수신 측 모두 이것을 지원해야 사용할 수 있다.
3. UDP가 고속으로 데이터를 전달하는 방법
- UDP는 다른 처리 없이 전송만 한다.
- 애플리케이션에서 추가 작업 필요