네트워크 통신 과정은 택배에 빗대어 표현하면, 이해가 비교적 쉽습니다.
오늘은 TCP/IP 네트워크 통신 과정을 택배에 빗대어 정리해보고자 합니다.
간단한 인터넷 통신
먼저, 간단한 인터넷 통신 예제를 들어보겠습니다.
카페에서 공부하다가 너무 배가 고파서 네이버에 햄버거 맛집 검색한 상황을 예로 들겠습니다.
저는 제 컴퓨터에서 네이버 서버로 햄버거 맛집 정보를 요청했습니다.
이 때, 제 컴퓨터는 Client가 되고, 네이버 서버는 Server가 됩니다.
Server에서 Client로 부터 햄버거 맛집 정보 요청(request) 받으면, Client에게 적절한 정보를 응답(response) 해줍니다.
이를 위해 네트워크 상에서 Client와 Server는 TCP/IP 연결을 시도합니다.
이 과정을 3-way handshake라고 부릅니다.

warm up
전체적인 TCP/IP 통신 과정을 설명하기에 앞서 간략하게 OSI 7 Layer에 대해 설명하겠습니다.
컴퓨터 설치를 해보았다면, 랜(LAN)선을 연결해보신 적이 있을 겁니다. 이 랜선은 NIC에 연결이 되는데, NIC은 고유한 MAC 주소를 가집니다. MAC 주소는 48bit로 표현하며, 보통 16진수로 표현됩니다. L2 Layer의 데이터 유통 단위는 Frame입니다.
이 L2 Layer까지는 하드웨어에 해당합니다.
우리는 어딘가로 요청을 보낼 때, 송신지와 수신지를 기입해야 합니다. IP는 송신지와 수신지 역할을 해줍니다. 즉, IP는 네트워크 상에서 사용되는 각종 장비들을 구분하고 통신하기 위해 부여되는 논리적인 주소입니다.
IP의 데이터 유통 단위는 Packet인데, 이 Packet의 Header 부분에 실제로 IP로 송신 IP와 수신 IP가 적혀있습니다.
근데 IP를 통해 컴퓨터로 도달한 Packet을 보고 컴퓨터는 컴퓨터 내에서 실행되고 있는 수많은 process 중 어디로 데이터를 전달해줘야할까요? 이는 port 번호로 알아낼 수 있습니다. 그래서 L4의 식별자는 port 번호이고 port는 process의 식별자라고도 말할 수 있습니다.
user -> kernel 영역으로 통신하기 위해서는 특정한 인터페이스를 통해야만 합니다. 형태는 File이고 우린 이걸 흔히 socket이라고 부릅니다. L5 ~ L7 Layer는 user mode에 있습니다. 우리하는 process를 실행하면서, socket을 통해 encapsulation(segment -> packet -> frame)해 데이터를 전송합니다. 반대로 데이터를 받으면, decapsulation(frame -> packet -> segment)를 수행해 데이터를 확인합니다. 이렇듯 한번에 전송할 수 있는 데이터 단위가 있어 데이터를 분할해 전송합니다.
위의 내용을 간략히 정리해보겠습니다.
OSI 7 Layer와 식별자
- L2 - MAC 주소 : NIC을 식별하는 식별자
- L3 - IP 주소 : host의 식별자
- L4 - port 번호 : process의 식별자
계층별 데이터 단위
- L1 ~ L2 : Frame
- L3 : Packet (최대 MSS)
- L4 : Segment (최대 MTU)

데이터 송신하기
컴퓨터에는 File을 저장하는 HDD, SSD와 같은 저장소가 있습니다. 너무 용량이 큰 파일을 한 번에 Process에서 읽을 수는 없습니다. 그래서 Process는 Memory상에 Buffer(이하 Buffer#1)를 띄워두고, Buffer에 데이터를 특정 단위로 쪼개서 읽어옵니다. 예를 들어 아래의 그림에서는 HDD에 저장된 1.4MB 파일을 Buffer에 64KB Size로 읽어왔습니다.
Process는 이 데이터를 송신하기 위해서 socket에 데이터를 write합니다. L4 TCP는 이 데이터를 전송가능한 단위로 분해합니다. 이때, Buffer#1에 있던 데이터를 Buffer#2로 복사합니다. Buffer#2에 올라온 데이터는 Segment 단위로 잘게 쪼개집니다. 이 Segment를 물건이라고 생각해봅시다.
물건을 택배로 보내기 위해서는 (1) 택배 상자로 포장하고, 송수신지 주소 기입을 해야합니다. 이처럼 네트워크 상에서도 이 Segment를 host의 주소인 IP를 기입해 택배처럼 보낼 수 있는 Packet으로 만듭니다.

이제 이 Packet을 택배 기사님께서 택배 상자를 수거해 트럭에 실어 운송하시는 것처럼 Frame(트럭에 비유) 단위로 전송되게 됩니다. 택배를 운반할 때, 한 트럭으로 운반되지 않는 것처럼 Frame도 전송되면, 여러 차례 변화를 거칩니다.

데이터 수신하기
택배가 집에 도착하면, 트럭(Frame)에서 택배 상자(Packet)을 내리고, 이 택배 상자를 뜯어 물건(Segment)를 확인합니다. 이렇게 수신된 Frame은 Frame -> Packet -> Segment로 Decapsulation됩니다. 이때 TCP Buffer에서 Segment를 File I/O Buffer로 가져와 Process에서 데이터를 읽는데, 이때 속도에 주의를 기울여야 합니다.
수신측에서 Segment를 조립해서 Buffer에 집어넣을 수 있는 Size를 Window Size라고 합니다. 만약 Process에서 데이터를 읽는 속도보다 Network 수신 속도가 빠르면 어떻게 될까요? 마치 배수가 안되는 배수구 처럼 넘처흐를 것입니다. Network 수신 속도가 Read 속도보다 빠르면 Window가 없어 Wait가 걸리게 됩니다. 이게 무슨 말일까요?
수신 측은 데이터를 잘 받으면 송신측에 잘 수신했음을 알립니다. 예를 들어 ACK#3은 "나 1~2번 잘 받았으니 이제 3번 보내"라는 의미입니다.

수신 측에서는 ACK#3이 올 때까지 기다립니다. 이 상태를 Wait라고 합니다. TCP가 UDP보다 느린 이유도 바로 이와 같은 확인 절차가 있기 때문입니다. 결론적으로 정리해보면, 송신측은 수신측의 이 Window Size를 확인하고, 데이터를 더 보낼지말지를 결정합니다.
즉, 수신측의 window size가 MMS(maximum segment size)보다 크면(Yes) 보내고(Send), 그렇지 않다면, 대기(Wait)합니다.

네트워크 전반적인 통신 절차를 알아보았습니다. 이 게시물은 널널한 개발자 TV님의 유튜브 강의를 참고하여 작성한 게시물입니다. 아래에 해당 유튜브 영상 링크를 공유해두겠습니다. 해당 게시물에서 잘 이해가 되지 않는 부분이 있거나, 틀린 부분이 있다면, 댓글로 적어주시면 감사하겠습니다.
Reference
https://youtu.be/K9L9YZhEjC0?si=1T9KUd48nIi1RuRO