TCP/UDP Network Protocol

Posted 2008. 11. 2. 14:00 by MINOK

1. TCP Network란?

- Transmission Control Protocol

- 인터넷 상의 컴퓨터들 사이에서 데이터를 메시지의 형태로 보내기 위해 IP와 함께 사용되는 프로토콜이다. IP가 실제로 데이터의 배달처리를 관장하는 동안, TCP는 데이터 패킷을 추적 관리한다. 여기서 메시지는 인터넷상에서의 효과적인라우팅을 위해 패킷이라는 여러 개의 작은 조각으로 나누어진다. 예를 들어 HTML파일을 Web Server로부터 사용자에게 보내질 때, 서버 내에 있는 TCP프로그램 계층은 파일을 여러 개의 패킷들로 나누고, 패킷번호를 붙인 다음, IP프로그램 계층으로 보낸다. 각 패킷이 동일한 수신지주고(IP주소)를 가지고 있더라도, 패킷들은 네트ㅡ워크의 서로 다른 경로를 통해 정송될 수 있다. 다른 한쪽 편(사용자 컴퓨터 내의 클라이언트 프로그램)에 있는 TCP는 각 패킷들을 재조립하고, 사용자에게 완전한 파일로 보낼 수 있을 때까지 기다린다.

 

2. UDP Network 란?

- User Datagram Protocol

- IP를 사용하는 네트워크 내에서 컴퓨터들 사이에서 메시지들이 교환될 때 제한된 서비스만을 제공하는 통신 프로토콜이다. UDP는 TCP의 대안이며, IP와 함RP 쓰일 때에는 UDP/IP라고 표현하기도 한다. TCP와 마찬가지로 UDP도 한 컴퓨터에서 다른 컴퓨터로 데이터그램이라고 불리는 실제 데이터 단위를 받기 위해 IP를 사용한다. 그러나 UDP는 TCP와 달리, 메시지를 패킷(데이터그램)으로 나누고, 반대편에서 재조립하는 등의 서비스는 제공하지 않으며, 특히 도착하는 데이터 패킷들의 순서를 제공하지 않는다. 이 말은 UDP를 사용하는 응용프로그램은 전체 메시지가 올바를 순서로 도착했는지에 대해 확인 할 수 있어야한다는 것을 의미한다. 교환해야할 데이터가 매우 적은 네트워크 응용프로그램들은 처리시간단축을 위해 UDP를 사용한다.

 

3. TCP와 UDP의 차이점

TCP : 호스트사이에 세션이 설정되어 승인 및 순차적인 데이터 전송이 보장되며 신뢰할 수 있는 데이터 전송만을 보장한다. 때문에 더 느리고 더 많은 오버헤드가 필요하며 지점 간 통신만 지원한다.

-연결형 방식, 점대점 통신

-보장성서비스제공(flow control, error control, congestion(체증) control)

-Full Duplex 통신, Graceful 연결해제

-Byte(stream)-Oriented → segment 단위로 전송하지만 stream of byte로 취급되고 따라서 모든 Bytes는 번호가 붙여진다.

 

UDP : 호스트사이에 세션이 설정되지 않는 연결 없는 서비스이기에 승인 및 순차적인 데이터 전송이 보장되지 않는다. 더 빠르고 오버헤드가 적게 필요하며 지점 간 통신과 지점 대 다중 지점 간(point-to-multipoint)통신을 지원한다.

-비연결형 방식

-비보장성 서비스 제공

-Datagram-Oriented

 


4. Source Code Analyze

◎ TCP/IP - Server

#include "stdio.h"

#include "string.h"

#include "fcntl.h"

#include "stdlib.h"

#include "sys/socket.h"

#include "sys/file.h"

#include "netinet/in.h"

 

int main()

{

int serversock, clientsock;

struct sockaddr_in serveraddr, clientaddr; //socket open

 

int addr_len = sizeof(struct sockaddr);

char buf[1024];

int recv_count;

 

if( (serversock = socket(AF_INET, SOCK_STREAM, 0)) < 0 )

{

perror("socket");

exit(-1);

}

 

bzero( (char*)&serveraddr, sizeof(serveraddr) );

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(2006);

serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

//Bind

if( bind(serversock, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0 )

{

perror("bind");

exit(-1);

}

//Listen

if( listen(serversock, 0) < 0 )

{

perror("listen");

exit(-1);

}

 

printf("listening...\n");

//Accept

clientsock = accept(serversock, (struct sockaddr*)&clientaddr, &addr_len);

printf("connected from %s[%d]\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));

 

while(1)

{

recv_count = recv(clientsock, buf, 1024, 0);

if(recv_count == -1)

break;

printf("%s\n", buf); //수신된 메시지를 출력한다.

send(clientsock, buf, 1024, 0); //수신된 메시지를 재전송한다.

}

 

//socket close

close(clientsock);

close(serversock);

return 0;

}

 

◎ TCP/IP - Client

#include "stdio.h"

#include "fcntl.h"

#include "stdlib.h"

#include "sys/socket.h"

#include "sys/file.h"

#include "netinet/in.h"

 

int main()

{

int client;

 

//socket open

struct sockaddr_in serveraddr;

struct sockaddr_in clientaddr;

char buf[1024];

 

if( (client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 )

{

perror("socket");

exit(-1);

}

bzero( (char*)&serveraddr, sizeof(serveraddr) );

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(2006);

serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

//Connect

if( connect(client, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0 )

{

perror("connect");

exit(-1);

}

 

while(1)

{

printf("input your data : ");

memset(buf, 0, 1024);

gets(buf); //입력받은 문자열 저장

if(strcmp(buf, "exit") == 0) //exit문자열과 비교 같을 때 빠져나감

break;

 

send(client, buf, 1024, 0); //저장된 문자열 송신

memset(buf, 0, 1024);

recv(client, buf, 1024, 0); //재전송된 메시지 수신

printf("echo data : %s\n", buf); //재전송된 메시지 출력

}

close(socket); //socket close

return 0;

}

 

 

◎ UDP/IP - Server

#include "stdio.h"

#include "string.h"

#include "fcntl.h"

#include "stdlib.h"

#include "sys/socket.h"

#include "sys/file.h"

#include "netinet/in.h"

 

int main()

{

int serversock;

 

//socket open

struct sockaddr_in serveraddr, clientaddr;

 

int addr_len;

char buf[1024];

int recv_count;

 

if( (serversock = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )

{

perror("socket");

exit(-1);

}

 

bzero( (char*)&serveraddr, sizeof(serveraddr) );

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(9000);

serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

 

//bind

if( bind(serversock, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0 )

{

perror("bind");

exit(-1);

}

 

printf("Waiting...\n"); //대기메시지 출력

 

while(1)

{

addr_len = sizeof(clientaddr);

 

//recvform

recv_count = recvfrom(serversock, buf, 1024, 0,(struct sockaddr*)&clientaddr, &addr_len);

if(recv_count == -1)

break;

 

printf("%s\n", buf); //수신메시지 출력

//sendto 수신된 메시지 재전송

sendto(serversock, buf, 1024, 0,(struct sockaddr*)&clientaddr, sizeof(clientaddr));

}

 

close(serversock); //socket close

return 0;

 

}

 

◎ UDP/IP - Client

#include "stdio.h"

#include "fcntl.h"

#include "stdlib.h"

#include "sys/socket.h"

#include "sys/file.h"

#include "netinet/in.h"

 

int main()

{

int client;

//socket open

struct sockaddr_in serveraddr;

 

char buf[1024];

 

if( (client = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )

{

perror("socket");

exit(-1);

}

bzero( (char*)&serveraddr, sizeof(serveraddr) );

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(9000);

serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

 

 

while(1)

{

printf("input your data : ");

memset(buf, 0, 1024);

gets(buf); //입력받은 문자열 저장

if(strcmp(buf, "exit") == 0) //exit문자열과 비교 같을 때 빠져나감

break;

//sendto 저장된 문자열 server부로 전송

sendto(client, buf, 1024, 0,(struct sockaddr*)&serveraddr, sizeof(serveraddr) );

 

 

memset(buf, 0, 1024);

recvfrom(client, buf, 1024, 0,NULL,NULL);//server로부터 재전송된 메시지수신

printf("echo data : %s\n", buf); //재전송된 메시지 출력

}

close(socket); //socket close

return 0;

}

 

 

 

'Computer Engineering > Embedded System Archictecture' 카테고리의 다른 글

Thread 생성과 응답속도  (0) 2008.10.08

« PREV : 1 : 2 : 3 : 4 : ··· : 30 : NEXT »