글쓴이: 익명 사용자 / 작성시간: 수, 2017/07/12 - 2:30오전
이제 방금 소켓 통신을 공부하기 시작했습니다
그런데 다른 의문이 드는 점이 있는데
socket(AF_INET, SOCK_STREAM, 0) 이렇게
socket생성자를 사용할 때 protocol을 설정할 때
IPPROTO_TCP , IPPROTO_UDP 같은 걸 잘 사용하지 않고 0을 많이 사용하시더라고요
혹시 0을 사용하는 이유나 0을 사용하게 되면
소켓 프로토콜이 어떻게 설정되는지 알려주시면 감사하겠습니다
sockfd = socket(int socket
Internet Protocol(IP)에 보면 Protocol이라는 필드가 있습니다.
예를 들어 IP헤더 위에 (ping에서 쓰이는)ICMP인지, UDP 패킷인지 TCP 패킷인지 구분은
Protocol 필드에 의해 구분됩니다.
그런데, socket_type에 보통 두가지를 지정합니다. SOCK_DGRAM 또는 SOCK_STREAM을 지정하게 되는데
SOCK_DGRAM은 패킷단위의 L4를 의미하며 SOCK_STREAM은 연결지향의 L4를 의미합니다.
일반적인 경우 SOCK_DGRAM은 UDP를 가리키며 SOCK_STREAM은 TCP를 가리키기 때문에 "0"값을 넣어도
"알아서" 해당 API 내부에서 Protocol 값을 넣어줍니다. 그래서 0을 넣는것입니다.
참고로, SOCK_STREAM에는 TCP만 있는 것이 아닙니다. SOCK_DRAM도 UDP만 있는 것이 아니구요.
TCP와 UDP는 SOCK_STREAM과 SOCK_DRAM의 대표적인 구현중 하나 일 뿐입니다. 이론상은 그런데... 사실상 이것만 쓰지요. 만약 SOCK_STREAM에 TCP가 아닌 다른 연결지향의 프로토콜을 지정하고 싶다면
이런식으로 호출하게 되겠죠.
(SOCK_STREAM과 SOCK_DRAM사이의 중간쯤 되는 물건인 SOCK_SEQPACKET 이것도 있습니다. 순서를 보장하고 연결지향적이며 stream이 아니라 패킷단위의 전송을 보장하는... 실제 구현되어 있는지는 모르겠네요.)
https://linux.die.net/man/7/socket
https://linux.die.net/man/2/socket
https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
댓글 달기