#include struct hostent* gethostbyname(const char* hostname); // success: hostent 구조체 변수의 주소값 fail: NULL 포인터 위 함수를 이용하면 문자열 형태의 도메인 이름으로 IP 주소 정보를 얻을 수 있습니다. 위 함수의 반환 자료형인 hostent 구조체의 정의는 다음과 같습니다. struct hostent{ char * h_name char ** h_aliases; int h_addrtype; int h_length; char ** h_addr_list; } IP주소 말고도 여러 정보들을 반환해주는 것을 볼 수 있습니다. h_name은 공식 도메인 이름이 문자열로 저장됩니다. 해당 홈페이지를 대표하는 도메인 이름이라는 의미지만 우..
윤성우
Domain Name System, DNS란 IP주소와 도메인 이름 사이에서의 변환을 수행하는 시스템입니다. DNS의 중심에는 DNS 서버가 존재합니다. 티스토리의 IP주소인 121.53.105.234를 직접 입력하면 티스토리의 페이지를 볼 수 있습니다. 그러나 일반적으로는 티스토리의 도메인 이름인 www.tistory.com을 입력해서 티스토리에 접속하게 됩니다. 둘 모두 똑같이 티스토리에 접속할 수 있습니다. 다만 접속 과정에서는 차이가 있습니다. 도메인 이름은 서버에 부여된 가상의 주소입니다. 만약 도메인 이름으로 접속하게 되면 컴퓨터에 저장되어있는 디폴트 DNS 서버의 주소로 변환을 요청하고 해당 도메인 이름의 IP 주소를 얻어서 서버로 접속하게 됩니다. 일반적으로 IP주소를 외우는 것보다 도메인..
TCP에서는 연결과정보다 중요한 것이 종료과정인데, 종료과정에서는 예상치 못한 일이 발생할 수 있기 때문입니다. close 함수 호출은 송수신을 바로 불가능하게 만드는 완전종료를 의미합니다. 만약 호스트 B가 전송한 데이터가 호스트 A가 꼭 전송받아야 하는데 A가 close를 호출해버리면 호스트 B가 전송한 데이터는 소멸됩니다. 따라서 송신은 가능하지만 발신은 종료하거나 또는 그 반대를 하게 해주는, 데이터의 송수신에 사용되는 스트림의 일부만 종료(half-close)하는 방법이 제공됩니다. 여기서 스트림이란 말이 사용됐는데, 소켓을 통해 두 호스트가 연결되고 데이터의 송수신이 가능한 상태를 스트림이 형성된 상태라고 합니다. 스트림은 단방향성을 가지고 있어, 서로 송수신을 주고받으려면 (양방향 통신을 하..
UDP소켓에서는 데이터를 전송할 목적지의 IP와 PORT번호를 등록하지 않습니다. 그렇기 때문에 sendto 함수호출을 통한 데이터의 전송 과정은 크게 세 단계로 이루어져 있습니다. 1. UDP 소켓에 목적지의 IP와 PORT번호 등록 2. 데이터 전송 3. UDP 소켓에 등록된 목적지 정보 삭제 sendto 함수가 호출될 때마다 위의 과정을 반복하게 되는데, 이렇게 목적지 정보가 등록되어 있지 않은 소켓을 가리켜 "unconnected 소켓"이라고 합니다. 반면 목적지가 정해져 있는 UDP소켓을 "connected 소켓"이라고 합니다. 이 소켓은 하나의 호스트에게 오랜 시간 데이터를 송수신 해야할 때 (하나의 호스트에게 sendto 함수를 많이 호출해야 할 때) 사용합니다. 위 과정의 1,3을 줄이게 ..
UDP는 TCP와 달리 데이터의 경계가 존재하는 프로토콜입니다. 따라서 데이터의 송수신 과정에서 호출하는 입출력 함수의 호출 횟수가 큰 의미를 갖습니다. 그렇기 때문에 데이터를 전부 수신하기 위해선 입력함수의 호출횟수와 출력함수의 호출횟수는 완벽하게 일치해야합니다. 만약 데이터를 수신하는 호스트A와 데이터를 송신하는 호스트B가 다음과 같이 송수신을 한다고 합시다. //호스트 A// for(int i=0; i
UDP에서는 TCP와 달리 연결 설정 과정이 필요 없으므로 listen 함수와 accept 함수는 사용하지 않고 UDP 소켓의 생성과 데이터의 송수신 과정만 존재합니다. 또, UDP는 하나의 소켓으로 둘 이상의 호스트를 대상으로 데이터의 송수신이 가능하므로 소켓은 하나만 있으면 됩니다. 다만 TCP는 상대와 연결되기에 주소 정보를 따로 추가하지 않아도 되지만 UDP 소켓은 연결상태를 유지하지 않으므로 데이터를 전송할 때마다 목적지의 주소정보를 별도로 추가해야 합니다. #include ssize_t sendto(int sock, void *buff, size_t nbytes, int flags, struct sockaddr *to, socklen_t addrlen); //success: 전송된 바이트 수 ..
UDP는 TCP와 달리 흐름제어를 하지 않습니다. 따라서 UDP는 데이터 송수신간 신뢰할 수는 없지만 UDP는 TCP보다 훨씬 빠릅니다. (한번에 송수신하는 데이터의 양이 적을수록 둘의 간격이 커집니다. - 흐름제어 유무차이) 호스트 B가 A에게 데이터를 보낸다고 가정할 때, B가 보낸 UDP 패킷은 먼저 IP를 통해 호스트 A에게 도착하고, 이때부터가 UDP의 역할로 호스트A 내에 존재하는 UDP 소켓중 하나에 최종 전달하게 됩니다. UDP는 물론 데이터의 손실이 적은 편이지만 수 많은 데이터중에서 한개라도 손실되면 안되는 압축파일같은 경우는 반드시 TCP로써 송수신이 이뤄져야 합니다. 다만 실시간 스트리밍과 같은 데이터 손실이 그저 화면이 떨리는 등 큰 영향을 끼치지 않는 경우 TCP보다 빠른 UDP..
TCP 소켓이 생성되고 소멸하기까지 크게 나눠서 세 가지로 구분할 수 있습니다. - 상대 소켓과 연결 - 상대 소켓과 데이터 송수신 - 상대 소켓과의 연결 종료 먼저 소켓과의 연결 과정입니다. TCP 소켓은 연결 과정에서 총 세 번의 대화를 하는데, 이를 Three-way handshaking이라 합니다. 소켓은 전 이중 방식으로 동작하므로 양뱡향으로 데이터를 주고받을 수 있습니다. 따라서 데이터 송수신을 하기 이전에 준비가 필요한데, 먼저 연결요청을 하는 호스트 A가 B에게 [SEQ:1000 ACK:-]를 전달합니다. 여기서 SEQ 1000은 패킷의 번호가 1000이고, 잘 수신했다면 1001번 패킷을 전달하라고 말해달라는 뜻입니다. 처음 연결 요청에 사용되는 메시지여서 SYN(Synchronizati..