Linux 시스템에서 네트워크 데이터 패킷을 보내고 받는 과정을 간략하게 설명합니다.

WBOY
풀어 주다: 2024-02-12 21:54:33
앞으로
674명이 탐색했습니다.

리눅스 서버가 네트워크 데이터 패킷을 수신하면, 해당 데이터를 애플리케이션 프로세스로 단계별로 전송하기 위해 어떤 처리를 해야 하나요? 애플리케이션 프로세스가 데이터 패킷을 보낼 때 Linux는 어떻게 데이터 패킷을 보내나요? 오늘 우리는 이 주제에 대해 이야기하겠습니다.

네트워크 데이터 패킷을 수신할 준비가 되기 전에 Linux는 네트워크 하위 시스템 초기화, 프로토콜 스택 등록, 네트워크 카드 드라이버 초기화, 네트워크 카드 시작 등과 같은 많은 준비 작업을 수행해야 합니다. 이것이 준비되어야만 진정한 네트워크 패킷 수신을 시작할 수 있습니다.

네트워크 프로토콜 스택


네트워크 데이터 패킷을 보내고 받는 Linux를 소개하기 전에 먼저 Linux 네트워크 프로토콜 스택을 이해하겠습니다.

국제표준화기구(International Organization for Standardization)는 OSI 네트워크 모델인 개방형 시스템 상호 연결 참조 모델을 공식화했습니다. 이 모델은 주로 애플리케이션 계층, 프레젠테이션 계층, 세션 계층, 전송 계층 및 네트워크 계층, 데이터 링크 계층 등 7개 계층으로 구성됩니다. 물리층.

OSI 모델은 너무 복잡하기 때문에 개념적이고 이론적인 모델일 뿐이고 레이어가 너무 많아 네트워크 작업의 복잡성이 증가하므로 대규모로 적용되지 않았습니다.
우리가 가지고 있는 가장 일반적인 것은 TCP/IP 네트워크 모델입니다. Linux 시스템은 이 네트워크 모델에 따라 네트워크 프로토콜 스택을 구현합니다.

TCP/IP 네트워크 모델에는 애플리케이션 계층, 전송 계층, 네트워크 계층 및 네트워크 인터페이스 계층이라는 4개의 계층이 있습니다.

1. 애플리케이션 계층 OSI 참조 모델의 상위 계층에 해당하며 FTP, Telnet, DNS, SMTP 등과 같은 필요한 다양한 서비스를 사용자에게 제공합니다.

2. 전송 계층 OSI 참조 모델의 전송 계층에 해당하며 애플리케이션 계층 엔터티에 대한 종단 간 통신 기능을 제공하여 데이터 패킷의 순차적 전송과 데이터 무결성을 보장합니다. 이 계층은 TCP(전송 제어 프로토콜)와 UDP(사용자 데이터그램 프로토콜)라는 두 가지 주요 프로토콜을 정의합니다.

3. 네트워크 계층 OSI 참조 모델의 네트워크 계층에 해당하며 주로 호스트 간 통신 문제를 해결합니다. 여기에는 네트워크 전체에 걸쳐 데이터 패킷의 논리적 전송을 위해 설계된 프로토콜이 포함되어 있습니다. 호스트 주소 지정을 완료하기 위해 호스트에 IP 주소를 재할당하는 데 중점을 둡니다. 또한 다양한 네트워크에서 데이터 패킷 라우팅을 담당합니다. 이 계층에는 IP(인터넷 프로토콜), IGMP(인터넷 그룹 관리 프로토콜), ICMP(인터넷 제어 메시지 프로토콜)의 세 가지 주요 프로토콜이 있습니다.

4. 네트워크 인터페이스 계층 OSI 참조 모델의 물리 계층 및 데이터 링크 계층에 해당합니다. 호스트와 네트워크 간의 데이터 교환을 모니터링하는 역할을 담당합니다. 실제로 TCP/IP 자체는 이 계층의 프로토콜을 정의하지 않습니다. 대신 상호 연결에 참여하는 각 네트워크는 자체 물리 계층 및 데이터 링크 계층 프로토콜을 사용하여 TCP/IP의 네트워크 액세스 계층에 연결됩니다. ARP(주소 확인 프로토콜)는 OSI 참조 모델의 데이터 링크 계층인 이 계층에서 작동합니다.
Linux 시스템에서 네트워크 데이터 패킷을 보내고 받는 과정을 간략하게 설명합니다.

네트워크 패킷 수신


Linux 시스템에서 네트워크 데이터 패킷을 보내고 받는 과정을 간략하게 설명합니다.

네트워크 데이터 패킷이 네트워크 카드에 도달한 후 FIFO 순서로 네트워크 카드의 수신 대기열에 저장됩니다. 네트워크 카드는 DMA 기술을 통해 지정된 메모리 주소(링 버퍼)에 네트워크 패킷을 씁니다.

링 버퍼는 네트워크 카드 드라이버가 시작될 때 생성 및 초기화되며 sk_buff 버퍼의 설명자(물리적 주소 및 크기 등)를 저장합니다.

네트워크 패킷이 도착하면 링 버퍼에서 지정된 sk_buff 설명자를 가져와 DMA를 통해 해당 주소에 데이터를 씁니다. sk_buff의 데이터가 처리를 위해 상위 프로토콜 스택으로 넘겨진 후 링 버퍼의 설명이 새로 할당된 sk_buff로 업데이트됩니다.

그런 다음 네트워크 카드는 CPU에 하드웨어 인터럽트를 시작합니다. CPU는 하드웨어 인터럽트 요청을 수신하면 인터럽트 레지스트리에 따라 등록된 인터럽트 처리 기능을 찾습니다.

하드웨어 인터럽트 처리기 기능은 다음 작업을 수행합니다.

1. 네트워크 카드 중단 차단

목적은 CPU가 자주 중단되어 다른 작업을 처리할 수 없는 것을 방지하는 것입니다. 인터럽트 마스킹은 다음에 데이터 패킷을 수신할 때 네트워크 카드에 데이터를 쓸 수 있음을 알려줍니다. CPU에 알리지 않고 메모리에 직접 전달합니다.

2. 소프트 인터럽트를 시작하고 방금 차단된 인터럽트를 복원합니다

커널의 ksoftirqd 스레드는 소프트 인터럽트를 수신한 후 해당 소프트 인터럽트 처리 함수를 호출하여 데이터를 폴링하고 처리합니다. 즉, sk_buff로 표시되는 링 버퍼에서 데이터 프레임을 가져와서 네트워크 패킷으로서의 네트워크 프로토콜 스택은 아래에서 위로 계층별로 처리됩니다.

네트워크 프로토콜 스택은 다음과 같이 네트워크 패킷을 처리합니다.

1. 네트워크 인터페이스 레이어

먼저 네트워크 인터페이스 계층은 메시지의 적법성과 정확성을 확인합니다. 불법이거나 메시지 확인이 올바르지 않으면 해당 메시지를 폐기합니다. 그렇지 않으면 상위 계층 프로토콜(IPv4 또는 IPv6) 유형을 찾아 프레임 헤더를 제거합니다. 그리고 프레임 트레일러를 처리한 다음 상위 계층인 네트워크 계층에 맡겨 처리합니다.

2. 네트워크 레이어

네트워크 계층은 IP 헤더를 꺼내어 네트워크 패킷이 상위 계층으로 전달될 것인지, 전달될 것인지의 다음 방향을 결정합니다. 네트워크 패킷이 로컬 시스템으로 전송될 것임을 확인한 후 상위 계층 프로토콜 유형(예: TCP 또는 UDP)을 제거하고 IP 헤더를 제거한 다음 처리를 위해 전송 계층으로 전달합니다.

3. 전송 계층

전송 계층은 TCP 헤더 또는 UDP 헤더를 꺼낸 후 4개의 튜플[소스 IP, 소스 포트, 대상 IP, 대상 포트]을 기반으로 해당 소켓을 찾고 데이터를 소켓의 수신 버퍼에 복사합니다.

4. 애플리케이션 레이어

마지막으로 애플리케이션 계층 프로그램은 소켓 인터페이스를 호출하여 커널의 소켓 수신 버퍼에 있는 데이터를 애플리케이션 계층의 버퍼에 복사합니다.

이 시점에서 네트워크 패킷 수신 프로세스는 끝났습니다.

네트워크 패킷 보내기


네트워크 패킷의 수신 과정을 이해하고 나면 네트워크 패킷의 전송 과정도 쉽게 이해할 수 있습니다. 네트워크 패킷의 송신 방향은 수신 방향과 정확히 반대입니다.

먼저 애플리케이션은 소켓 인터페이스를 호출하여 네트워크 패킷을 보냅니다. 이것은 사용자 모드에서 커널 모드의 소켓 계층으로 떨어지는 시스템 호출입니다.

소켓 계층은 커널 모드 sk_buff 메모리를 적용하고 사용자가 보낼 데이터를 sk_buff 메모리에 복사한 다음 소켓 전송 버퍼에 추가하여 네트워크 프로토콜 스택의 처리를 기다립니다.

네트워크 데이터 패킷은 애플리케이션에서 커널로 전송될 때 원시 데이터이므로 프로토콜 스택은 데이터가 서버에 도달할 때 올바르게 인식될 수 있도록 원시 데이터에 통신 규칙을 추가해야 합니다. 네트워크 프로토콜 스택은 소켓 전송 버퍼에서 데이터 패킷을 가져온 다음 TCP/IP 스택의 계층(전송 계층, 네트워크 계층, 네트워크 인터페이스 계층)에 따라 위에서 아래로 계층별로 처리합니다. 프로토콜 헤더를 변환합니다. 정보는 데이터 패킷에 지속적으로 삽입됩니다.

데이터 패킷 전송을 위한 프로토콜 스택의 처리 흐름은 다음과 같습니다.

1. 전송 계층

전송 계층에서는 TCP 헤더가 서버에 추가되고 sk_buff의 새 복사본이 복사됩니다. 이는 sk_buff가 네트워크 카드에 도달하고 전송이 완료되면 해제되며 TCP 프로토콜은 재전송을 지원하기 때문입니다. . 네트워크 패킷의 안정적인 전송을 보장하기 위해 상대방으로부터 ACK를 받기 전에는 이 sk_buff를 삭제할 수 없습니다.

2. 네트워크 레이어

네트워크 계층에서는 주로 경로 선택(다음 홉의 IP 확인), IP 헤더 채우기, 넷필터 필터링, MTU 크기를 초과하는 데이터 패킷 조각화 등의 작업을 수행합니다. 이러한 작업을 처리한 후 처리를 위해 네트워크 인터페이스 계층으로 전달됩니다.

3. 네트워크 인터페이스 레이어

네트워크 인터페이스 계층은 물리적 주소 지정을 수행하여 다음 홉의 MAC 주소를 찾고, 프레임 헤더와 프레임 트레일러를 채운 후 전송 대기열에 넣습니다. 그런 다음 소프트 인터럽트를 트리거하여 네트워크 카드 드라이버에 다음을 알립니다. 대기열에 전송해야 할 새로운 네트워크 패킷이 있습니다. 드라이버가 알림을 받으면 DMA를 통해 전송 패킷 대기열에서 네트워크 프레임을 읽고 DMA를 통해 네트워크 카드의 FIFO 전송 대기열에 데이터를 씁니다.

4. 네트워크 카드 장비

네트워크 카드 장치는 FIFO 전송 대기열에서 데이터 패킷을 꺼내어 네트워크로 보냅니다. 전송이 완료되면 네트워크 카드 장치는 주로 sk_buff 메모리를 해제하고 RingBuffer를 정리하기 위해 하드 인터럽트를 트리거합니다. 메모리. 마지막으로 이 TCP 메시지의 ACK 응답이 수신되면 전송 계층은 원래 sk_buff를 해제합니다.

이제 네트워크 패킷을 보내는 과정은 끝났습니다.

위 내용은 Linux 시스템에서 네트워크 데이터 패킷을 보내고 받는 과정을 간략하게 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:lxlinux.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿