<aside> 📌
먼저 기억할 세 가지
WSASend 완료 ≠ NIC 송신 완료 ≠ 상대 수신 완료.SO_SNDBUF=0은 전체 Zero-copy 보장이 아니다. 반면 RIO의 사전 버퍼 등록·페이지 고정은 공식적으로 확인된다.
</aside>send는 일반 송신 API이고, WSASend는 여러 WSABUF와 Overlapped 송신을 지원한다. 개념적인 송신 흐름은 다음과 같다.
애플리케이션 버퍼 (WSABUF)
↓ WSASend
Winsock / AFD / TCP-IP
├─ 필요에 따라 커널 버퍼링·복사 등 처리
└─ TCP 전송 시점·재전송·흐름/혼잡 제어 결정
↓
NDIS (NET_BUFFER_LIST → NET_BUFFER → MDL 체인)
↓
미니포트 (DMA 매핑 / scatter-gather 디스크립터)
↓
NIC (DMA로 메모리에서 읽어 네트워크에 송신)
※ IOCP 완료 통지는 별도: 위 단계를 전부 마쳤다는 뜻은 아님.
TCP_NODELAY는 Nagle을 비활성화하지만 무조건 즉시 전송을 보장하진 않는다.AFD.sys가 특정 API를 호출하는 정확한 내부 순서로 해석하면 안 된다.근거: WSASend, NDIS Sending Network Data.
SO_SNDBUF는 송신 버퍼링에 관한 옵션이다. 한도를 넘었다고 복사를 즉시 중단하는 것은 아니며, 완료 통지만 지연될 수도 있다.SO_SNDBUF=0은 Winsock 송신 버퍼링 비활성화를 뜻하지만, 전 계층의 메모리 복사 0회나 MmProbeAndLockPages 직접 호출을 증명하지는 않는다. 작은 패킷에서는 오히려 성능이 나빠질 수 있다.| 결과 | 의미 |
|---|---|
반환값 0 |
Overlapped 송신이 즉시 완료됨 |
SOCKET_ERROR • WSA_IO_PENDING |
요청 접수 성공, 나중에 완료됨 |
| 그 외 오류 | 요청 시작 실패, 해당 요청의 정상 완료 통지를 기대하지 않음 |
FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 등 알림 설정 예외를 확인해 중복 처리나 누락을 피해야 한다.근거: WSASend 반환 및 완료 규칙, IOCP.