Socket Communication
<aside>
🎫
소켓 함수 호출 순서(UDP)

</aside>
<aside>
🥼
바이트 순서 함수
<aside>
🛤️
TCP/IP Packet Transmission

- 데이터 전송 시 레이어 별 동작 과정
- Application ~ Ethernet
- Driver
- NIC
<aside>
🛤️
TCP/IP 패킷 송신 - Driver와 NIC

- Build send descriptors(TX Ring 생성)
- 송신 디스크립터 생성
- 이 디스크립터들은 TX Ring이라는 큐 형태의 데이터 구조에 저장
- Tell NIC There are New Descriptors(NIC에 알림)
- CPU는 NIC의 레지스터의 새 디스크립터가 준비되었음을 알림
- NIC는 TX Ring을 읽고 데이터를 가져올 준비를 함
- Fetch(DMA)descriptors
- 디스크립터에서 확인한 주소로 실제 패킷 데이터를 메모리에서 읽어옴
- Fetch(DMA)packet
- NIC가 패킷 데이터를 준비하여 네트워크로 송신할 준비를 완료
- Transmit Packet
- Update DMA State Block
- Interrupt
- 송신 작업 완료를 알리고 추가 송신 작업을 준비하도록 유도
</aside>
<aside>
🏸
TCP/IP 패킷 수신 - Driver와 NIC

- Allocate Packet Buffers and Build Receive Descriptors(RX Ring 생성)
- Tell NIC There Are New Descriptors(NIC에 알림)
- Fetch (DMA) Descriptors
- NIC가 패킷 데이터를 올바른 메모리 위치에 저장하기 위한 준비 단계
- Packet Arrives
- Write (DMA) Packet
- Write (DMA) Receive Return Descriptor
- 패킷 수신 완료 정보를 CPU로 전달하기 위해 메타데이터를 제공
- Interrupt
- 패킷 수신 완료를 CPU에게 알리고, 상위 계층으로 데이터를 전달하도록 트리거
</aside>
<aside>
🧤
DMA란
- 컴퓨터의 CPU를 거치지 않고 주변 장치(NIC)가 메모리에 직접 데이터를 읽고 쓰는 기능
</aside>
<aside>
🩰
Interrupt vs Polling
- Interrupt
- 패킷이 올 때마다 전송
- 장점
- 단점
- 패킷 전달이 많아지면 CPU가 다른 작업을 못함
- Polling
- CPU가 NIC를 지속적으로 보고있어 메모리에서 가져감
- Packet 통신이 빈번하지 않는 경우
- Packet 통신이 빈번한 경우
NAPI
- Interrupt + Polling
- 기본적 수신 버퍼가 있어 어떤 임계 값에 도달하면 interrupt 발생, timer로 buffer가 다 안차도 interrupt로 전송(polling의 먼저 온 패킷 방치 단점을 해결)
</aside>