개발 공부/HTTP 공부

[HTTP] 커넥션 관리

종범2 2020. 6. 28. 18:43

TCP/IP 모델

데이터를 통신하는 단계와 순서를 명세하는 설계도에는 두 가지 모델이 있는데, OSI 참조 모델과 TCP/IP 모델이다. OSI 참조 모델은 데이터 통신을 7단계로 나누었고 TCP/IP 모델은 4 단계로 나누었다. 현재는 TCP/IP 모델이 표준이 되었고 각 단계에서 사용하는 프로토콜은 다음과 같다.

 

4계층 애플리케이션계층 HTTP 어플리케이션 사이 신호를 전달하는 방법을 결정
3계층 트랜스포트계층 TCP 전달할 데이터나 전달된 데이터에 필요한 처리를 하는 방법을 결정
2계층 인터넷계층 IP 네트워크(세그먼트) 사이 신호를 전달하는 방법을 결정
1계층 인터페이스계층 Ethernet 한 네트워크(세그먼트) 내에서 신호를 전달하는 방법을 결정

 

TCP 커넥션

TCP 커넥션은 데이터를 주고받기 위한 가상의 통로를 의미한다. TCP 커넥션을 이용하면 신뢰성 높은 통신이 가능한데, 그 이유는 에러를 복구하고 통신 상태를 확인하기 때문이다. 에러 복구의 경우, 데이터를 보내는 도중에 에러가 발생해서 확인 응답이 돌아오지 않으면 데이터를 보내 에러를 복구한다. 통신 상태 확인의 경우, 쓰리웨이 핸드셰이크를 이용하여 통신 상태를 확립한다. TCP 커넥션에서 쓰리웨이 핸드셰이크란 A에서 B로 데이터를 보낼 때 A에서 B에게 커넥션을 요청하고, B가 커넥션 요청을 받아들이고 이를 A에게 알려주고, 최종적으로 A가  B에게 커넥션이 잘 되었음을 알려주는 방식으로 커넥션을 확립하는 방법을 의미한다.

 

TCP 커넥션에서 지연 사유

TCP 커넥션에서 데이터를 주고 받을 때 지연이 발생할 수 있는데 그 사유에는 5가지가 있다. 고성능의 HTTP 소프트웨어를 개발하는 경우에는 이 지연 사유를 신경써야하며 성능 최적화 단계가 아닌 경우에는 신경쓸 필요가 없다.

  • 핸드셰이크 지연 : 핸드세이크를 이용하여 커넥션을 확립하는 동안 데이터를 주고받는데 이때 걸리는 시간으로 인해 지연이 발생한다. 특히 작은 크기의 데이터를 주고받는 경우에는 커넥션 확립 중에 주고받는 데이터가 더 큰 경우도 있다. 이는 TCP 커넥션을 유지하는 방법으로 해결한다.
  • 확인응답 지연 : 수신자가 데이터를 받으면 데이터를 온전히 받았다는 정보를 송신자에게 보내야 한다. 이때 이 정보를 확인 응답이라고 한다. 확인 응답은 크기가 작기 때문에 호율성을 위해 송신자에게 데이터를 보낼 때 같이 보낸다. 이때 같이 보낼 데이터를 찾는 동안 걸리는 시간으로 인해 지연이 발생한다. 만약 여기서 문제가 크게 발생한다면 확인응답과 관련된 기능을 수정하거나 비활성화할 수 있다.
  • TCP 느린시작 : 인터넷의 급작스러운 부하를 막기 위해서 연결이 된 후 초반에는 한 번에 전송할 수 있는 데이터의 크기를 한정한다. 이로 인해 지연이 생길 수 있다. 이 역시 TCP 커넥션을 유지하는 방법으로 해결한다.
  • 네이글 알고리즘 : 데이터를 주고받을 때 보내고자 하는 내용을 제외하더라도 헤더와 플래그와 같은 데이터를 보내야 하기 때문에 너무 자주 데이터를 주고받는 경우를 막아야 한다. 이를 막고자 네이글 알고리즘을 도입했다. 이 알고리즘을 사용하면 보내야 할 데이터가 특정 크기를 넘지 않으면 데이터를 보내지 않는다. 이때 특정 크기에 도달할 때까지 대기하는 시간으로 인해 지연이 발생한다. 만약 여기서 문제가 크게 발생한다면 이 알고리즘을 비활성화할 수 있다.
  • TIME_WAIT의 누적과 포트 고갈 : TCP 커넥션을 끊으면 같은 주소와 포트 번호를 사용하는 TCP 커넥션을 일정 기간 동안 생성하지 못한다. 이로 인한 지연이 발생한다. 이는 가상 IP 주소를 사용해서 해결할 수 있다.

 

커넥션 방법

  • 병렬 커넥션 : 병렬 커넥션은 여러개의 커넥션을 생성하여 데이터를 주고 받는 방법이다. 이를 이용하면 한꺼번에 많은 양의 데이터를 주고 받을 수 있다. 하지만 네트워크의 대역폭이 좁거나 너무 많은 커넥션을 생성해야하는 경우에는 더 느려질 수 있으므로 주의해야한다.
  • 지속 커넥션 : 지속 커넥션은 커넥션을 끊지 않고 유지해서 데이터를 주고받는 방법이다. 이를 이용하면 핸드셰이크 지연과 TCP 느린 시작이 발생하지 않아 데이터를 빠르게 주고받을 수 있다.
  • 파이프라인 커넥션 : HTTP/1.1의 경우 지속 커넥션을 활용해서 요청을 파이프라이닝할 수 있다. 지속해서 데이터를 전송하여 데이터가 네트워크상의 왕복으로 인한 시간을 줄일 수 있다.

 

대부분 병렬 커넥션과 지속 커넥션 두가지 방법을 모두 사용하는데 적은 수의 병렬 커넥션을 생성하고 이를 유지시는 방법이다. 지속 커넥션을 사용할때 이를 파이프라인 커넥션으로도 사용할 수 있는데, 이 경우에는 커넥션이 지속 커넥션이어야하고 POST 메서드와 같이 서버의 데이터에 변화를 주는 요청을 보낼 때는 주의해야한다. 밑의 그림은 일반적인 커넥션, 지속 커넥션, 파이프라인 커넥션을 이용했을 때 데이터를 주고받는 모습을 표현한 그림이다.

 

참고자료

https://book.naver.com/bookdb/book_detail.nhn?bid=8509980

 

HTTP 완벽 가이드

성공적인 웹 트랜잭션 뒤의 숨은 핵심, HTTP의 모든 것『HTTP 완벽 가이드』는 HTTP 규약이 어떻게 작동하고 웹 기반 애플리케이션을 개발하는 데 어떻게 사용하는지 설명하고, HTTP가 효율적으로 동

book.naver.com

'개발 공부 > HTTP 공부' 카테고리의 다른 글

[HTTP] HTTP 메세지  (0) 2020.06.22
[HTTP] URL과 리소스  (0) 2020.06.22