[Network] TCP가 느린 이유(기억 되살리기용! 자세한 설명은 링크참조!)

RisingJade의 개발기록·2022년 3월 22일
0

왜 TCP는 느리다고 할까?


해당 유투브를 보고 기억 되살리기용으로 올립니다.
https://www.youtube.com/watch?v=K9L9YZhEjC0&t=1252s

보통 네트워크 공부할 때 중간보스격으로 나오는 TCP/UDP 이 중에서 TCP는 연결지연이 있어 느리다고 한다.
물론 기본적으로 TCP는 패킷 몇개 보내고 제대로 보냈는지 확인하기 위해 ACK가 올때까지 대기를 타는 것이 느리는 첫번 째 이유다.
그 외에 느려지는 이유에 대해 자세히 알아보자
(TCP 관련 기본적인 것들은 다른 블로그에도 많고, 위키백과에도 설명이 잘되어있다...)

https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C
(TCP 위키백과)

1. 받는 측 Window Size크기 문제

기본적으로 TCP는 3-way handshake이후 서로의 연결상태를 확인한 상태에서 한쪽에서 데이터를 주면 다른 쪽에서 받는 형태인데
이때, 보내는 쪽의 MSS(Maximum Segment Size)와 받는쪽의 Window Size(tcp 버퍼)중 작은 쪽으로 버퍼 크기를 맞춘다. 그후 보내는 측에서 MSS에 있는 패킷을 보내면 받는 쪽 Window Size(Tcp 버퍼)에 패킷이 쌓이게 되고 쌓인 패킷은 적절한 시간이후 받는 측의 memory 버퍼(보통 socket의 버퍼)로 올라가게 된다.
이때, 만약 TCP 버퍼에서 socket 버퍼로의 copy가 느리면, 즉 Read가 제대로 작동이 안되면, 보내는 측에서 받는 측의 남아있는 window size와 자신의 MSS를 비교하고 이게 MSS가 더 작으면 send를 하지만 MSS가 더 크면 wait이 걸린다.
이때의 Wait으로 인해 현저하게 느려질 수 있다.

  • 이를 해결하기 위해 TCP 버퍼에서 Socket 메모리로 Read하는 것을 제때제때 잘 부르게 설계해서 window size가 꽉 차지 않게 관리해주거나 TCP 버퍼 자체를 키우거나 해주자
profile
언제나 감사하며 살자!

0개의 댓글