열혈 TCP/IP 소켓 프로그래밍 내용 확인문제 chap.02

in tcp •  6 years ago  (edited)

1. 프로토콜

프로토콜이란 통신규약으로 데이터를 주고받기 위해 정해놓은 규칙을 말한다. 예를 들어, a가 b에게 사진을 전송한다고 했을 때 메일로 보내는지, 우편으로 보내는지, 메신저로 보내는지, 아니면 b도 모르는 또 다른 매체를 통해서 보내는지 알 수 없다면 b는 그 사진을 전달받을 수 없다. 뿐만 아니라 암호화된 데이터가 어떻게 암호화됐는지 알 수 없다면 데이터를 전달받아도 이것을 해석할 수 없다. 따라서 통신에는 약속이 필요하고 송수신에 있어서 프로토콜을 정의한다는 것은 서로 통신을 하기 위해 필요한 약속을 정하는 것과 같다.

2. TCP

소켓의 타입(type)에는 연결지향형 소켓(SOCK_STREAM) TCP와 비 연결지향형 소켓(SOCK_DGRAM) UDP가 있다. 그 중 TCP의 특징은

  • 데이터를 목적지까지 확실히 전달한다 (수신처가 데이터를 받지 못했을 경우 재전송한다).
  • 전송 순서대로 데이터가 수신된다.
  • 데이터의 경계(boundary)가 존재하지 않는다 (즉 여러 번의 write도 한 번의 read로 수신할 수 있다).

3. UDP

비 연결지향형 소켓 UDP의 특징은

  • 전송된 데이터는 손실될 수 있다.
  • 데이터의 경계가 존재한다.
  • 가장 빠른 전송을 목표로 하며 순차적 데이터 수신을 보장하지 않는다.
  • 한 번에 전송할 수 있는 데이터의 크기가 제한 된다.
  • 연결지향형 소켓과는 달리 '연결'이라는 개념이 존재하지 않는다.

4. TCP/UDP

a. (UDP) b. (TCP) c. (TCP)
데이터의 신뢰성이 보장되어야 하는 분야에서는 TCP를 사용해야 한다. IP전화나 비디오 스트리밍의 경우 한 두번 끊겨도 대화나 영상의 내용이 바뀌는 것이 아니며, 이런 분야에선 실시간이 중요하기 때문에 UDP가 적합하다.

5. 데이터의 경계 (Boundary)

데이터의 경계가 존재하지 않는 소켓은 TCP이다. 따라서 TCP에서는, 여러 번의 write 함수 호출로 전송된 데이터도 한 번의 read 함수 호출로 수신할 수 있다. 이 반대의 경우도 가능하다. 소켓은 내부적으로 버퍼(buffer)를 가지고 있는데, 소켓을 통해 전송된 데이터는 일단 버퍼에 저장되며, read 함수 호출로 버퍼에서 데이터를 읽어들이고 버퍼가 꽉 차면 송신처에서 데이터를 전송하지 않는다.

6. TCP를 이용해서 여러 차례의 write 함수 호출을 한 번의 read 함수 호출로 받기

tcp_server.c에서 for문을 이용하여 write를 10번 호출한다.

for(i=0;i<10;i++){
  write(clnt_sock,message,sizeof(message));
}


tcp_client.c에서 read함수 호출 시기를 늦추기 위해 책에서 주어진 for문 대신에 scanf를 사용하였다.

scanf("%d",&i);
read_len=read(sock,message,sizeof(message));
 
for(j=0;j<9;j++){
   message[13*j+12]='\n';
}
  
printf("Message from server: %s \n", message);
printf("Function read call count: %d \n",read_len);

중간에 for문을 사용하지 않으면 hello world가 한 줄만 출력된다.

<결과>
스크린샷 2018-05-28 오전 9.35.36.png

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!