
연결지향 프로토콜과 비연결지향 프로토콜의 차이점을 이해하라#
서브넷과 CIDR을 이해하라#
사설 주소와 NAT를 이해하라#
애플리케이션 "골격"을 개발하고 사용하라#
XTI/TLI보다 소켓 인터페이스를 사용하라#
TCP가 스트림 프로토콜이라는 것을 기억하라#
네트워크 프로그래머가 범할 수 있는 가장 흔한 오류 중 하나는 TCP가 레코드 경계의 개념이 없는 바이트 스트림을 전달하는 것을 이해하지 못하는 것이다. TCP는 사용자가 볼 수 있는 "패킷"의 개념을 가지고 있지 않다고 언급함으로써 우리는 이런 중요한 사실을 요약할 수 있다. TCP는 단순히 바이트의 스트림을 전달할 뿐이고, 우리는 각각의 읽기에서 얼마나 많이 읽혀졌는지를 확실히 예측할 수 없다. 주어진 읽기에 대해 반환되는 데이터의 양은 예측할 수 없기 때문에, 애플리케이션이 이를 다룰 수 있도록 준비해야 한다.
가장 간단한 경우는 고정길이 메시지이다. 이런 경우는 메시지로 고정된 수의 바이트를 읽으면 된다.
가변길이의 메시지를 지원해야 하는 애플리케이션의 경우, 사용 가능한 두 가지 방법이 있다. 첫 번째 방법은, 레코드들이 EOR(end-of-record)표시에 의해 구분되는 것이다. 또 다른 방법 하나는, 메시지의 길이를 포함하는 헤더를 메시지의 앞에 붙이는 것이다. 수신 애플리케이션은 메시지를 두 부분으로 읽는다. 우선 고정길이 메시지 헤더를 읽고, 헤더에서 가변길이 부분의 길이를 알아낸 후, 가변길이 부분을 읽는다.
TCP의 성능을 과소평가하지 말라#
항상 UDP가 TCP보다 성능이 좋은 것은 아니다. 애플리케이션이 짧은 요청/응답 세션을 요구할 경우 UDP가 TCP보다 훨씬 좋은 성능을 발휘하며, 연결이 오래 지속되는 경우에는 TCP가 UDP에 비해 더 나은 성능을 가진다.
TCP를 재수정하는 것을 피하라#
TCP는 신뢰성 있는 프로토콜이지만 결함이 없는 프로토콜은 아니라는 것을 알아야 한다#
TCP/IP는 연결 닫기 정보를 통보하지 않는다는 점을 기억하라#
상대측에서 발생할 수 있는 의외의 행동에 대비하라#
성공적인 LAN 전략이 WAN에도 적용될 것이라고 생각하지 말라#
프로토콜이 어떻게 동작하는지를 배워라#
OSI 7 계층을 너무 심각하게 받아들이지 말라#
TCP의 쓰기 작업을 이해하라#
올바른 순서의 TCP 릴리스 작업을 이해하라#
inetd가 애플리케이션을 시작하게 하는 것을 생각해 보라#
tcpmux가 서버이 잘 알려진 포트를 "할당"하도록 하는 것에 대해 고려하라#
두 개의 TCP 연결 사용을 고려하라#
이벤트 드리븐 기능을 가진 애플리케이션의 제작을 고려하라(1)#
이벤트 드리븐 기능을 가진 애플리케이션의 제작을 고려하라(2)#
연결을 닫기 위해 TIME-WAIT 정보 사용을 폐기하지 말라#
서버는 SO_REUSEADDR 옵션을 설정해야 한다#
가능하면 조금씩 여러 번 보내지 말고 한번에 많이 보내라#
connect 호출을 타임아웃하는 방법을 이해하라#
데이터의 복사를 피하라#
사용 전에 sockaddr_in 구조를 0으로 설정하라#
바이트 저장 순서에 관한 것을 잊지 말라#
애플리케이션 내에 고정 IP 주소와 포트 번호를 사용하지 말라#
connected UDP 소켓을 이해하라#
TCP/IP 프로그래밍에 C가 전부가 아니라는 것을 기억하라#
버퍼 크기의 효율성을 이해하라#
ping 유틸리티와 친숙해져라#
tcpdump나 유사한 도구의 사용법을 배워라#
traceroute의 사용법을 배워라#
ttcp 사용법을 배워라#
lsof 사용법을 배워라#
netstat 사용법을 배워라#
시스템 호출 추적 도구의 사용법을 배워라#
ICMP 메시지를 캡처하기 위한 도구를 제작하고 사용하라#
Stevens를 읽어라#
코드를 읽어라#