각 소켓에는 메시지를 보내고 받을 수 있는 자체 버퍼가 있습니까?

각 소켓에는 메시지를 보내고 받을 수 있는 자체 버퍼가 있습니까?

널리 사용되는 C 애플리케이션을 개발 중입니다.소켓.

내 의심은: 내가 만든 각 소켓에 다른 소켓에서 메시지를 보내거나 받을 수 있는 자체 버퍼가 있습니까?

즉, 메시지 교환으로 인해 소켓이 영향을 받습니까?잘못?

버그란 메시지를 "의도된" 수신자에서 다른 소켓으로 명시적으로 전송하기 위해 프로그램 코드를 작성하지 않고도(아마도 버그가 있는) 한 소켓으로 보낸 메시지가 다른 소켓으로 "누출"될 수 있다는 것입니다.

답변1

내가 만드는 각 소켓에는 다른 소켓에서 메시지를 보내거나 받을 수 있는 자체 버퍼가 있습니까?

예.

그렇지 않으면 소켓 API는 기본적으로 사용할 수 없으므로 제안하는 이유가 바로 이것입니다.

사용 중인 소켓 유형을 지정하지 않았으므로 명확히 하자면 다음과 같습니다.

  • 각 TCP/스트림 소켓에는 고유한 송신 및 수신 버퍼가 있습니다.

    이러한 버퍼는 백그라운드에서 재전송, 승인 관리, 리어셈블리 등을 처리하는 데 필요합니다.

  • 각 UDP/데이터그램 소켓에는 자체 수신 버퍼가 있지만 반드시 고유하고 지속적인 송신 버퍼가 있는 것은 아닙니다.

    영구 전송 버퍼가 필요한 재전송 논리가 없습니다.

  • a는 socketpair두 소켓 간에 버퍼를 공유할 수 있습니다(또는 각 방향의 버퍼).

    비교를 위해 a pipe(소켓과 달리)는 단방향이므로 일반적으로 두 파일 설명자 간에 공유되는 버퍼가 하나만 있습니다.

답변2

예, TCP와 UDP는 다중화된 네트워크를 위한 것입니다. 많은 가상 네트워크를 만듭니다.

IP는 패킷만 보냅니다. 이 기계에서 저 기계로 이동하는 것만으로도 무엇이든 될 수 있습니다. 채널도 없고, 재전송도 없고, 전달하려고만 합니다. 이것이 인터넷이 작동하는 방식입니다.

TCP와 UDP는 여기에 채널(소켓)을 추가합니다. TCP는 재전송을 추가합니다. 잘못될까?

  • 데이터 손상을 감지하려면 체크섬을 사용해야 합니다. 체크섬이 충분히 강력합니까(TCP에는 충분하지 않을 수도 있지만 하드웨어 계층에는 좋은 체크섬이 있음).
  • 소프트웨어에서는 버그를 작성하고 잘못된 채널/소켓으로 전송/수신할 수 있습니다.
  • 그러나 다른 프로세스에서 파일 핸들을 전달하지 않는 한 프로세스에서 열려 있지 않은 소켓에서는 보내고 받을 수 없습니다.

관련 정보