Linux의 TCP/IP 버퍼링에 대한 질문

Linux의 TCP/IP 버퍼링에 대한 질문

나는 Linux에서 패킷 전송의 일부로 TCP/IP에서 사용되는 버퍼를 찾으려고 노력해 왔습니다. 더 많이 읽을수록 나는 더 혼란스러워집니다. 아래에 내 문제가 있습니다. 누군가 내가 알아낼 수 있도록 도와 줄 수 있습니까?

1) 드라이버 큐는 TCP의 수신 및 전송 버퍼와 마찬가지로 설명자가 skbs를 가리키는 링 버퍼로 구현됩니까? 그렇지 않다면 TCP의 수신/전송 버퍼는 언제 패킷 전송에 나타나나요?

2) TCP 연결 백로그 큐는 수락/수신 큐와 완전히 다른가요? 백로그 대기열은 패킷 전송에서 어디에 적합합니까? 백로그 대기열은 보류 중인 연결을 위한 것임을 이해합니다.

3) 각 소켓에는 TCP 수신/전송 버퍼에서 데이터를 전송하기 위한 별도의 버퍼가 있습니까?

4) 들어오는 연결에 대한 올바른 프로세스는 무엇입니까? NIC -> 커널 링 버퍼(skb) -> IP 스택 -> TCP 수락/수신 버퍼 -> Qdisc 레이어 -> 연결을 위한 소켓 버퍼.

답변1

일반적으로 네트워크 드라이버에는 자체 대기열이 있으며 Linux에서는 패킷이 sk_buff에 저장되고 대기열에 들어갑니다. 이는 커널 패킷 처리에 관한 한 가장 중요한 구조입니다. 이 버퍼(sk_buff)에는 현재 TCP, IPv4/IPv6 등 헤더에 대한 포인터가 포함되어 있습니다.

TCP 백로그는 TCP 상태를 처리하고 재조립할 패킷을 버퍼링하는 struct sock에 의해 처리됩니다.

일반적으로 가장 중요한 구조는 sk_buf와 sock이라고 말하고 싶습니다. 커널 소스 코드 외에도 이 링크를 확인하는 것이 도움이 될 수 있습니다.

https://ops.tips/blog/how-linux-tcp-introspection/

http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html

그것이 당신에게 도움이 되기를 바랍니다

관련 정보