Network - TCP의 성능에 대한 고려
TCP의 성능
Application들은 네트워크를 통해 메시지를 전달하기 위해 TCP
를 이용하게 됩니다. 따라서 Client
와 Server
간 Web 요청과 응답을 주고 받기위해 사용하는 HTTP 프로토콜 역시 TCP의 성능에 영향을 받을 수 밖에 없습니다.
이번 포스팅에서는 TCP 프로토콜의 성능에 영향을 미치는 요인들에 대해 정리를 해보고자 합니다.
고성능의 HTTP Application
사실 엄청난 고성능의 HTTP이 아니라면 TCP의 지연 요소들에 자세히 알 필요까지는 없습니다. 반대로 고성능의 어플리케이션을 만들고자 한다면 필히 숙지 해야합니다.
TCP 성능에 영향을 미치는 요소
TCP성능에 영향을 미치는 요소들은 아래와 같습니다.
- TCP 연결 핸드셰이크 지연(연결지향)
새로운 TCP 커넥션을 열때면 무조건 적으로 TCP 커넥션을 맺기 위해 패킷을 주고받게 되어있습니다. (연결지향) 아래는 TCP 커넥션을 맺기 위한 과정입니다.
- Client는 Server에 연결을 맺기 위해
SYN
플래그가 설정된 패킷을 전송합니다. (SYN는 커넥션 연결 생성 요청과 같습니다.) - Server는 커넥션 요청에 응하기 위한
ACK
플래그와, Server에서 Client로의 연결을 위한SYN
플래그가 설정된 패킷을 Client 에게 전송합니다. - Client는 연결에 응하기 위해
ACK
플래그가 설정된 패킷을 Server에게 전송합니다.
Application에서 크기가 아주 작은 메시지를 주고받는 경우에는 위와 같이 TCP 연결을 맺기 위한 시간이 대부분을 차지하게 됩니다.
- 확인 응답 지연 (성공적인 데이터 전송을 위한)
트랜스포트 계층의 바로 하위 계층인 네트워크 계층의 인터넷 프로토콜(IP)
은 비연결, 비신뢰성 프로토콜입니다. 이 때문에, TCP는 데이터의 순서
및 성공적인 데이터 전송
을 보장하기위해서, 자체적으로 확인 체계를 가지고 있습니다.
올바른 데이터 전송을 위한 지연
TCP 세그먼트는 순서를 보장하기위해 각 세그먼트에
순번
을 포함하며, 데이터 무결성을 보장하기 위한데이터 무결성 체크섬
을 포함합니다. 만약 송신자가 특정 시간안에 수신자로부터 응답을 받지 못하거나 순서가 잘못된 응답이 온다면, 다시 패킷을 보내게 됩니다.네트워크 효율을 위한 지연
TCP에서는
확인응답(ACK)
의 크기가 매우 작기 때문에, 같은 방향으로 전달되는 데이터에 확인응답을 편승시킴으로써 네트워크를 효율적으로 사용하려 합니다. 이 때 확인응답이 송신되는 데이터에 편승되는 확률을 높이기 위해확인응답 지연 알고리즘
을 사용합니다.(확인응답 지연 알고리즘은 확인응답 패킷을 일정시간 동안 버퍼에 저장해두고, 확인 응답을 편승시키기 위한 송출 데이터 패킷을 찾습니다. 일정시간 안에 찾지 못한다면 확인응답 전송을 위한 별도의 패킷을 만들어 전송합니다.)
- 느린시작(Slow Start)에 의한 지연(혼잡제어를 위한)
TCP는 네트워크의 대역폭 이상의 데이터가 송출됨으로써 데이터가 담긴 패킷이 손실되는것을 방지하기위해 혼잡제어
를 합니다. 즉, 적정수의 패킷을 네트워크로 흘려보내기 위해 제어를 한다는 의미입니다. ( 혼잡제어를 위한 알고리즘에는 AIMD
, Slow Start
, Fast Retransmit
, 등등이 존재합니다. )
Slow Start 알고리즘은 커넥션의 최대 속도를 제한하고, 데이터가 성공적으로 전송됨에 따라 점차 속도 제한을 높여 나갑니다. 이 때문에, 새롭게 연결된 커넥션의 경우, 이미 적정 수준의 속도를 갖춘 연결(튜닝된 커넥션) 보다는 당연히 느릴 수 밖에 없습니다.