• 카테고리

    질문 & 답변
  • 세부 분야

    네트워크

  • 해결 여부

    해결됨

Server Process 측 Buffer 질의드립니다.

24.03.26 01:30 작성 조회수 97

0

안녕하세요 널널한개발자님! 먼저 좋은 강의 해주셔서 감사드립니다.

 

  1. Server 측에서 봤을 때 File의 데이터를 Block 단위로 읽어서 Process의 Buffer에 write 하고, Socket I/O Buffer로 send 하면서 최초로 읽었던 Block 단위 데이터는 지우면서 새로운 Block 단위 데이터를 읽어드리는 것으로 이해하는게 맞는걸까요?
    (클라이언트 쪽 Buffer 설명시에는 지우고 채우고의 설명이 있었는데, 서버 쪽 Buffer 설명시에는 언급이 없으셨어서 약간 헷갈림이 발생하여 질문드리게 됐습니다.)

  2. 1번에서 이해한 내용이 맞다면, 두번째 Block 단위 데이터에 대해 Segmentation이 일어나면 count 번호는 6번부터 시작한다고 이해하는게 맞을까요?

  3. Socket 인터페이스도 결국 File 형식이라는 설명은, Process 가 정해진 형식의 File로 write 한다고 이해하면 될까요?

질문 읽어주셔서 감사합니다!!

 

답변 2

·

답변을 작성해보세요.

1

  1. 아니오 프로세스 버퍼의 내용은 지워지지 않습니다. 그리고 소켓의 입/출력 버퍼도 엄밀히 말해 값을 지우지는 않습니다. 관리 영역이 아닌 것으로 처리하는 방식 혹은 처리가 완료되어 제외하는 방식으로 작동하기 때문입니다. 이는 전적으로 효율을 위한 조치라 하겠습니다. 결과적으로 '지운다'라 할 수는 있겠습니다. 그리고 이는 수신측도 사실 마찬가지 입니다. 다만, 제가 강의에서 설명한 것처럼 생각하고 이해하는 것이 결과적으로 잘못된 것은 아닙니다. 이에 대한 더 깊은 이해를 원한다면 관련 라이브러리를 직접 개발(C/C++)해보면 알 수 있습니다.

  2. 카운터 번호가 아니고 Sequence 번호입니다. TCP의 Sequence 번호는 송신하는 Segment의 바이트 단위 크기만큼 증가합니다. 그래서 엄밀히 말해 1, 2, 3, n 형식으로 증가하지 않습니다. 이 부분에 대해서는 이해를 위해 작은 값을 그것도 크기가 아니라 일련번호처럼 붙인 것입니다. 강의에서 이 부분에 대해 사전 언급한 부분이 있습니다.

  3. 네, 맞습니다. send()의 실제 동작은 바로 write()이고 recv()의 실제 동작은 read() 입니다. 참고하시기 바랍니다. 😄

이길훈님의 프로필

이길훈

질문자

2024.03.29

답변 주셔서 완전 감사합니다!! ㅎㅎ

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.26

안녕하세요, 인프런 AI 인턴입니다.

질문하신 내용에 대해 서버 측 버퍼와 관련하여 처리 과정에 대한 설명뿐만 아니라, 소켓 인터페이스가 파일 형식으로 처리되는 부분에 관한 이해도를 돕기 위해 다음 답변을 제공합니다.

  1. 서버 측에서 데이터를 블록 단위로 읽고, 프로세스의 버퍼에 쓰는 과정은 올바르게 이해하신 것 같습니다. 파일에서 데이터를 읽어 프로세스의 버퍼에 저장한 후, 소켓 I/O 버퍼에 전송하는 과정에서는, 일반적으로 프로세스 버퍼에서 해당 데이터를 관리하고 있다가 소켓 버퍼로 전송함으로써 네트워크를 통해 다른 측으로 데이터를 보내게 됩니다. 이 과정에서 데이터를 “지우고 채우는” 행위는 데이터의 전송 및 버퍼 관리 방식에 따라 달라질 수 있습니다.

  2. 세그멘테이션과 관련하여 “count 번호가 6번부터 시작한다”는 표현에 대해선, 보통 TCP/IP 통신에서 패킷이나 세그먼트의 순서를 관리할 때 초기 순서 번호나 이후 순서에 대한 명확한 설명 없이는 정확한 답변을 드리기 어렵습니다. 일반적으로 세그멘테이션이 일어난 경우 TCP 단계에서 패킷의 순서를 보장하며 순서 번호는 전송된 바이트 수를 기반으로 결정됩니다.

  3. 소켓 인터페이스가 파일 형식이라는 설명은, Unix/Linux 체제에서 “모든 것은 파일이다”는 철학에 기반한 부분입니다. 즉, 네트워크 통신을 위한 소켓 역시 파일과 유사한 인터페이스로 다루어지며, 이는 파일 입출력과 유사한 방식으로 네트워크 입출력을 처리할 수 있음을 의미합니다. 예를 들어, 파일에 데이터를 쓰는 것처럼 소켓에 데이터를 쓸 수 있고, 파일로부터 데이터를 읽는 것처럼 소켓으로부터 데이터를 읽을 수 있습니다.

해당 내용은 아래 답변에서 보다 자세한 설명을 찾을 수 있습니다.

  • [패킷의 생성과 전달 , 9분 30 초 질문] 소켓은 파일에서 질문입니다.](https://www.inflearn.com/questions/690080) : 소켓의 본질과 파일, 버퍼, 스트림에 대한 설명이 포함되어 있습니다. 이 답변은 소켓을 파일로 바라보는 관점과 관련된 근본적인 이해를 제공합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.