UDP소켓에서는 데이터를 전송할 목적지의 IP와 PORT번호를 등록하지 않습니다. 그렇기 때문에 sendto 함수호출을 통한 데이터의 전송 과정은 크게 세 단계로 이루어져 있습니다. 1. UDP 소켓에 목적지의 IP와 PORT번호 등록 2. 데이터 전송 3. UDP 소켓에 등록된 목적지 정보 삭제 sendto 함수가 호출될 때마다 위의 과정을 반복하게 되는데, 이렇게 목적지 정보가 등록되어 있지 않은 소켓을 가리켜 "unconnected 소켓"이라고 합니다. 반면 목적지가 정해져 있는 UDP소켓을 "connected 소켓"이라고 합니다. 이 소켓은 하나의 호스트에게 오랜 시간 데이터를 송수신 해야할 때 (하나의 호스트에게 sendto 함수를 많이 호출해야 할 때) 사용합니다. 위 과정의 1,3을 줄이게 ..
ip
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..
TCP소켓은 데이터 송수신의 경계가 없고, 데이터의 손실이 없습니다. 그러나 서버가 보낸 데이터보다 클라이언트가 받은 데이터가 적을 수도 있고, 그의 반대일 수도 있는데 아직 받지 않은 데이터는 어딨는건지 의문을 가질 수 있습니다. 데이터를 송신하는 쪽이 write 함수를 호출할 때 데이터가 출력버퍼로 이동하고, 데이터를 수신하는 쪽이 read 함수를 호출하면 입력 버퍼에 저장된 데이터를 읽어들이게 됩니다. 따라서 데이터를 보내면 먼저 출력버퍼에 전달되고, 상황에 맞춰 적당히 상대방의 입력버퍼로 전달됩니다. 특징을 정리하면 다음과 같습니다. - 입출력 버퍼는 TCP 소켓 각각에 대해 별도 존재 - 입출력 버퍼는 소켓생성시 자동으로 생성 - 소켓을 닫아도 출력버퍼에 남아있는 데이터는 계속해서 전송 - 소켓..
지금부터 구현할 서버와 클라이언트의 동작방식은 다음과 같습니다. - 클라이언트는 서버에 접속하자마자 피연산자의 개수 정보를 1바이트 정수형태로 전달 - 피연산자의 개수만큼 4바이트의 정수를 전달 - 정수를 전달한 다음, 1바이트 크기의 연산자의 종류 전달 (+,-,*) - 서버의 연산 결과를 4바이트 정수로 받아옴 - 연산 결과를 얻은 클라이언트는 서버와 연결 종료 클라이언트입니다. socket 생성, connect 호출까지는 똑같습니다. 선언되어 있는 변수와 매크로는 다음과 같습니다. #define BUF_SIZE 1024 #define RLT_SIZE 4 #define OPSZ 4 // 버퍼 크기, 결과 크기, 피연산자 크기 int sock; char opmsg[BUF_SIZE] // 서버에 보낼 문..
위 그림은 Iterative 서버의 함수호출 순서, TCP 서버-클라이언트 구현을 나타낸 것입니다. Iterative 서버란 반복문을 삽입해 accept 함수를 반복 호출해서 연결요청을 하는 모든 클라이언트에게 서비스를 제공하는 개념입니다. 클라이언트가 connect()로 연결요청을 하면 서버의 listen()에서 할당된 연결요청 큐에 추가됩니다. 서버는 들어온 연결요청을 하나하나 accept() 하고 서비스를 제공하고 close()로써 마무리하는 과정을 반복합니다. 이러면 한 번에 한 클라이언트에게만 서비스를 제공할 수 있게 되는데, 이는 프로세스와 쓰레드를 통해 다중 클라이언트에게 서비스를 제공하는 서버를 만들 수 있게 됩니다. echo란 입력한 문자열을 그대로 출력해주는 것(명령어 등)을 뜻합니다...