Linux의 어떤 프로세스가 실제로 수신 측의 네트워크 계층에서 정보를 가져오고 모든 TCP 관련 논리(TCP 수준 오류 검사, 세그먼트 승인 등)를 적용하고 이를 수신 버퍼에 넣는지 알고 싶습니다. 수신측이 연결을 기다리고 있나요?
반면, 호스트 애플리케이션이 소켓으로 보낸 정보를 수신하여 처리하고 네트워크 계층으로 보내는 프로세스는 무엇입니까?
어쩌면 제가 프로세스를 제대로 이해하지 못했을 수도 있습니다. 도와주세요.
답변1
귀하의 질문은 혼란스럽습니다. TCP/IP를 설명하기 위해 OSI 모델을 기반으로 합니다. 그러나 이것은 불가능하다. TCP/IP는 OSI보다 먼저 출시되었으며 해당 모델을 고수할 의도가 전혀 없었습니다. HTTP/2를 지원하는 브라우저를 사용하여 이 페이지를 방문하면 네트워크 자체의 WAN 최적화는 말할 것도 없고 최소 3개의 서로 다른 스택 레이어에서 압축이 처리되는 최소 4개의 별도 세션 레이어가 있습니다.
Linux에서 TCP를 담당하는 프로세스는 무엇인가요?
TCP는 커널에서 발생합니다. 사용자 프로세스에는 없습니다. 따라서 참조 프레임에 따라 전부 또는 전혀 없습니다.
답변2
코드에 관한 한 실제로 커널 공간에 존재하는 코드이며 NIC 드라이버에서 위쪽으로 TCP 구현을 처리합니다. Linux 커널은 네트워크 하드웨어를 이해하고 이를 링크 어댑터 세트로 추상화합니다. 그런 다음 TCP/UDP/IP 스택은 이러한 "링크" 장치를 인식하고 이를 소켓과 같은 Linux/Unix 수준 개념으로 추상화합니다.
프로세스는 커널에 대한 시스템 호출을 통해 이 기능에 액세스합니다. Linux의 프로세스 개념은 커널과 격리되거나 제한되어 있지만 기술적으로 모든 프로세스는 시스템 호출을 통해 이 기능에 액세스할 수 있습니다.
이는 NIC에서 데이터가 수신되면 커널이 TCP를 처리한다는 의미입니다. 애플리케이션이 버퍼로부터 데이터를 수신하면 프로세스는 커널 공간/메모리에서 시작된 syscall을 통해 게이트 방식으로 TCP를 처리합니다.
Linux는 선점형이기 때문에 커널 공간에 대한 호출도 최소한 커널이 프로세스 공유 시간을 추적하는 방법의 일부이므로 기술적으로 TCP를 각 프로세스의 일부로 생각할 수 있습니다. 그러나 메모리 공간(사용자 공간 응용 프로그램) 처리에 속하는 코드만 고려한다면 커널만이 TCP를 처리합니다.
Linux/Unix는 애플리케이션이 컴파일될 때 링크되는 라이브러리로 TCP/IP를 추상화하는 일부 소켓 기능을 통합하므로 해당 메모리 공간에 상주하게 됩니다. 예를 들어 IP 주소를 나타내는 데 사용되는 메모리 구조입니다.