상세 컨텐츠

본문 제목

1 - 3) UDP/TCP 네트워킹

네트워크

by 부레두 2024. 5. 17. 23:41

본문

소켓 (Socket)

❓  단말기 사이에 통신할 수 있게 OS에서 제공하는 자원
  • 소켓 생성 시, 소켓 핸들 값이 반환, 대부분의 OS에서 int32 타입
  • 데이터를 주고 받기 위해 소켓의 목적지 : 포트를 할당

UDP(User Datagram Protocol )

 데이터를 보내기 위해 연결 설정이 필요하지 않음 데이터의 신뢰성을 보장하지 않음
송신한 후에도 수신 여부를 확인하지 않음 ⇒
신속한 데이터 전송이 요구되는 경우에 자주 사용
ex) 실시간 스트리밍, 온라인 게임
데이터가 손실될 수 있음
일 대 다 소켓 통신이 가능 패킷 유실 시 데이터그램이 유실

 

❓  사용자가 정의한 데이터그램을 상대방에게 보낼 수 있게 하는 통신 규약 메시지 형식
     사용법이 간단한 대신, 데이터 유실 또는 순서 뒤바뀜 같은 문제
가 생길 가능성이 있음

 

소켓 통신

→ 수신용, 송신용 소켓을 따로 만들지 않아도 가능

// 송신
main()
{
        s = socket(UDP);                       // 통신 규약 지정
        s.bind(any_port);                      // 포트 지정 = any_port 옵션 : 운영체제가 알아서 
        s.sendTo("55.66.77.88:7777", "hello"); // 상대 주소와 포트, 전송할 내용 전송
        s.close();                             // 소켓 핸들 닫음
}
// 수신
main()
{
        s = socket(UDP);                       // 통신 규약 지정
        s.bind(7777);                          // 포트 지정 = any_port 옵션 : 운영체제가 알아서 
        r = s.recvfrom();                      // r에 데이터 저장
        print(r.srcAddrPort, r.data);          // r에 저장된 데이터를 가공
        s.close();
}

TCP(Transmission Control Protocol)

데이터를 전송하기 전에 먼저 연결을 설정 전송에 대한 오버헤드가 있기 때문에, UDP에 비해 속도가 상대적으로 느릴 수 있음

데이터를 전송하기 전에 먼저 연결을 설정 전송에 대한 오버헤드가 있기 때문에, UDP에 비해 속도가 상대적으로 느릴 수 있음
정확성과 순서를 보장하기 위해 확인 및 재전송 기능을 제공 ex) 웹 브라우징, 이메일 전송, 파일 다운로드, 인터넷 대부분 패킷 유실시 중간에 지연 시간이 발생
일 대 일 소켓 통신만 가능  
자체 “흐름 제어 기능”이 있어 패킷 유실 발생시에도 데이터를 정확히 전송  

 

❓  보내는 쪽 데이터가 받는 쪽에서 완전히 동일함을 보장해 주는 통신 규약
     스트림 형식
     UDP의 단점을 해결하기 위해 성능을 양보한 프로토콜

 

 

소켓 통신

// 송신
main()
{
		s = socket(TCP);                       // 송신 전용 소켓 생성
		s.bind(any_port);                      // 포트 지정 = any_port 옵션 : 운영체제가 알아서 
		s.connect("55.66.77.88::7777);         // 수신 대상
		s.send("hello");
		s.close();
}
// 수신
main()
{
		s = socket(TCP);                      // 리슨 전용 소켓 생성
		s.listen(7777);                       // TCP 연결을 받는 고정된 끝점 확보
		s2 = s.accept();                      // 연결 받을떄 까지 블로킹
		print(getpeeraddr(s2));               // 수신쪽 끝점 정보 출력
		
		while(true)
		{
				r = s2.recv();                     // 데이터 수신
				if(r.length == 0)                  // 스트림 형식이기 때문에 0바이트 시 종료를 의미
					break;
				print(r);
		}
}

 

'네트워크' 카테고리의 다른 글

1 - 2) 스레드 (thread)?  (0) 2023.10.12
1 - 1) 멀티스레딩 개요  (1) 2023.10.11

관련글 더보기