• 결론 : send() ⇒ recv() 는 1:1 로 매핑되지 않음.

    • ex. send(1); send(1); 을 recv(128); 로 한 번에 받을 수 있음 !
  • send() ⇒ recv() 는 1:1 로 매핑되지 않음을 확인 (Wireshark)

    • Echo 서버 예제를 실행

    [1]

    • Echo 클라이언트 예제에서

      image.png

      ⇒ 다음과 같이 한 번에 서버로 전송하지 않고, 한 번에 버퍼의 한 글자씩 패킷에 담아서 전송하는 코드로 수정하고 실행

    • 클라이언트에서 hello 를 입력하여 버퍼에 저장 후 버퍼를 소켓에 담아 send()

      [Client]

      image.png

      • 서버와 클라이언트에서 Enter 를 친 후

      image.png

      [Server]

      image.png

      ⇒ 위 통신 과정에서 이루어진 패킷 전송 과정을 Wireshark 확인

      • tcp.dstport == 25000 으로 “목적지” 포트가 25000 인 패킷만 캡쳐하는 filter

        image.png

      ⇒ 한 글자씩 보내진 패킷들을 확인할 수 있음

    [2]

    • 이번엔 클라이언트를 다시 켜고 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 를 입력 한 다음 아직 Echo 받지 못한 데이터가 있을 경우 Enter 를 계속 눌러준다.

      image.png

    • 이 때, 클라이언트에서 서버로 ‘A’ 한 글자씩 패킷을 보냈을까? 를 Wireshark 로 확인한다.

      image.png

      ⇒ 그렇지 않다!

      ⇒ Nagle 알고리즘에 따라 클라이언트가 한 글자씩 패킷을 보냈더라도, TCP 는 이를 모아서 하나 또는 몇 개의 패킷으로 서버에 보낼 수 있음