본문 바로가기
Work/개발 노트

개발 노트, TCP에서 패킷 수신에 대한 정리

by ★용호★ 2015. 8. 27.

 TCP에 대한 작업을 할 때 레이어 간의 역할에 대해 혼동이 자주 온다. transport 레이어에서 하는 일이 application 레이어에서 하는 일로 혼동하기도 하고 그 반대로 생각하기도 해서 이럴 때마다 기본 지식이 많이 부족함을 느낀다. 그래서 대환이형과 얘기를 해보며 잘못된 지식을 바로 잡고 간단히 정리를 해보기로 했다. (주관적인 내용이므로 여기에 또다른 오류가 존재할 수도 있음)


 클라이언트에서 패킷 전달하면 라우터나 스위치같은 여러 기기를 거쳐서 서버로 전달이 되는데 이때 각 기기마다 MTU가 다르기 때문에 이 MTU크기에 맞춰서 패킷을 쪼개 보내게되고 각 쪼개진 패킷에는 시퀀스번호가 붙어서 가게 된다. 그리고 수신받는 서버에서는 쪼개진 패킷을 붙이는작업을 transport 레이어에서 하게 된다. (받지 못한 패킷이 있으면 여기서 다시 요청)

결과적으로 recv함수를 통해 받게되는 application 레이어에서는 완성된 패킷을 받게 된다.


 하지만 여기서 nagle 알고리즘을 통해 한번에 완성된 패킷 하나를 받는 것이 아니고 지정된 패킷 크기에 한해서 여러 패킷을 한번에 받을 수도 있다. 그래서 서버에서는 패킷을 구분할 수 있는 처리가 필요하기 때문에 패킷의 최상단에 total size를 기록하여 패킷을 구분하는 것이다.

댓글