가상현실프로그래밍 11주차

2021. 11. 18. 10:18학교수업

TCP/IP 주소의 구조

- 물리 주소(MAC 주소)는 네트워크인터페이스 카드(NIC) 6바이트(48비트) 주소 등을 말한다.

- 인터넷 주소 : 인터넷 에서는 기존 물리 주소와 별도로 각 호스트(PC)를 식별 할 수 있는 유일한 주소를 지정해야함

- 포트 주소 : 수신지 컴퓨터까지 전송하려면 IP주소와 물리주소가 필요

-> 인터넷 통신의 최종 목적은 한 프로세스가 다른 프로세스와 통신하는 것

 

IP(인터넷 프로토콜)

- 인터넷에 연결된 모든 컴퓨터에는 고유 주소가 부여 -> IP 주소

- 현재 IP 주소 체계는 IP Ver.4이다.

- IP 주소는 8비트 크기의 필드 네 개를 모아서 구성한 32비트(4바이트) 논리 주소

- xxx.xxx.xxx.xxx, 즉 163,152,19,114처럼 .(점)으로 구분한 10진수 형태 네 개로 구성

- 한 바이트가 가질 수 있는 10진수는 0~255이므로 IP주소 값은 0.0.0.0~255.255.255.255까지

 

TCP(전송 제어 프로토콜)

포트 번호

- 포트는 TCP가 상위 계층으로 데이터를 전달하거나 상위 계층에서 TCP로 데이터를 전달할 때 상호 간에 사용하는 데이터의 이동 통로를 뜻한다.

- 통신할 때 여러 웹사이트에서 파일을 동시에 다운로드 할 수 있다.

- 파일을 동시에 다운로드 할 수 있는 이유는 TCP 프로토콜이 포트를 여러 개 사용하여 상위 계층의 프로그램과 각각 따로 통신을 하기 때문이다.

- TCP 포트 범위는 0~65,534까지의 정수다.

 

전송 계층(Transport Layer)

- 프로토콜(TCP,UDP)과 관련된 계층으로 오류 복구와 흐름 제어 등을 담당 (신뢰성 있는 데이터 전송)

- 네트워크 계층에서 온 데이터를 세션 계층의 어느 애플리케이션으로 보낼지 판독, 전송할 경로 선택

- 시스템 종단 간에 투명한 데이터를 양방향으로 전송하는 계층

- 네트워크 계층에서 전송한 데이터와 실제 운영체제의 프로그램이 연결되는 통신 경로

 

- 인터넷 모델의 전송 계층에는 TCP와 UDP 프로토콜(규약)이 두 개 있다 // IP와 포트 사용

- TCP(Transmission Control Protocol : 전송 제어 프로토콜) // 많이 사용

-> TCP는 송신지에서 수신지까지 문자 스트림 전송하는데, 두 응용 계층이 서로 대화를 허용하는 신뢰성 있는 프로토콜

-> TCP 성능은 OSI 참조 모델의 전송 계층보다 뛰어남

- UDP(User Datagram Protocol : 사용자 데이터그램 프로토콜)

-> UDP는 OSI 참조 모델에서 정의하는 전송 계층의 일부 역할을 무시하는 단순한 전송 프로토콜

-> UDP는 TCP보다 신뢰성이 낮고, 흐름 제어 및 오류 검출 기능이 없이 패킷을 빠르게 전송하는 응용 계층에서 사용

 

TCP/IP 주소관계

- 응용 계층 -> ex) FTP, 텔넷, SMTP, DNS, DHCP

- 전송 계층 -> ex) TCP, UDP => 포트 주소

- 네트워크 계층 -> ex) IP, ARP, ICMP => IP 주소

- 네트워크 접속 계층 -> ex) PPP, SLIP, IEEE 802 이더넷, 모뎀, 네트워크 카드 => 물리 주소

 

네트워크 프로그래밍(=소켓 프로그래밍)

- 서버

-> 리스닝, 클라이언트 접속 대기, 스트림 생성 및 데이터 처리(읽기, 쓰기), 접속 해지

- 클라이언트

-> IP와 port를 이용해 서버 접속, 스트림 생성 및 데이터 처리(읽기, 쓰기), 접속 해지

 

소켓 프로그래밍

- 응용 계층에서 전송 계층의 기능을 사용할 수 있도록 제공하는 응용 프로그래밍 인터페이스

-> 네트워크 계층이나 전송 계층의 기능은 복잡하여 직접 사용하여 데이터 전송 프로그램을 작성하기 어렵다.

-> 하부의 내부 구조나 인터페이스 방식을 세부적으로 알 필요없이 쉬운 인터페이스 제공

 

서버 주요 함수 (Unity)

1. 서버 실행(포트 리스닝)

TcpListener server = new TcpListener(1500);

server.Start();

2. 클라이언트 접속 대기

TcpClient client = server.AcceptTcpClient();

3. 클라이언트 접속 종료

client.Close();

4. 네트워크 스트림 생성

NetworkStream stream = client.GetStream();

5. 데이터 전송

NetworkStream stream = client.GetStream();

byte[] sendBuffer = new byte[] {65,66,67,68,69}; //ABCDE (아스키 코드로)

stream.Write(sendBuffer,0,sendBuffer.Length); //출력을 보냄 (사용할 배열, 시작 값, 길이)

 

C# Thread

AcceptTcpClient()함수는 클라이언트 접속할 때까지 무한 대기를 하기에 thread로 구성해야함

Thread thread = new Thread(RunServer);

thread.Start();

private void RunServer() {...}

스트링 데이터 출력

- 기본적으로 네트워크 통신은 byte 배열로 이루어짐

- C#에서 일반적으로 사용하는 문자열(한글)을 전송하려면 UTF-8 타입으로 인코딩 필요

byte[] ToByte(string msg)

{

int byteCount = Encoding.UTF8.GetByteCount(msg); //몇 바이트가 되는지

byte[] sendBuffer = new byte[byteCount]; // 할당

sendBuffer = Encoding.UTF8.GetBytes(msg); // sendBuffer 배열에 저장

return sendBuffer; // 반환

}

 

byte[] sendBuffer = ToByte("한글");

stream.Write(sendBuffer,0,sendBuffer.Length); 로 사용

 

다중 접속 허용

- 기존 방식으로 다중 접속을 하면 서버가 닫혀 오류가 발생한다.

-> while(true) 무한 루프를 이용하여 클라이언트 접속 후 접속 대기 모드 실행

 

클라이언트 주요 함수

1. 서버 접속

TcpClient client = new TcpClient("127.0.0.1", 1500);

2. 스트림 생성

NetworkStream stream = client.GetStream();

3. 데이터 읽기

Byte[] bytes = new Byte[1024];

int length;

length = stream.Read(bytes,0,bytes.Length);

4. 접속 종료

client.Close();

 

private void RunClient() //접속 ip와 port번호로 접속(서버는 실행중이어야함), byte단위로 데이터 읽음

{

Thread.Sleep(500);

TcpClient client = new TcpClient("127.0.0.1",1500);

Byte[] bytes = nw Byte[1024];

int length;

NetworkStream stream = client.GetStream();

length = stream.Read(bytes,0,bytes.Length);

 

for(int i=0;i<length;i++) print(bytes[i]);

}

 

Byte데이터 스트링으로변환

string ToString(byte[] btyes, int length)

{

var incommingData = new byte[length];

Array.Copy(bytes,0,incommingData,0,length);

return Encoding.UTF8.GetString(incommingData);

}

 

이를 편리하고 더욱 효율적으로 하기 위해 StreamWriter / StreamReader 클래스를 사용할 수 있다.

-> Byte 데이터를 직접 다루지 않고 상위에서 문자열이나 자료타입기반 입출력 데이터를 다룬다.

-> 한글 인코딩 지원, 라인단위 입출력 제공

 

동시 접속 echo 클라이언트 / 서버

'학교수업' 카테고리의 다른 글

정보보호개론 11주차  (0) 2021.11.19
정보보호개론 10주차  (0) 2021.11.18
가상현실프로그래밍 10주차  (0) 2021.11.17
임베디드기초 10주차  (0) 2021.11.15
웹개발기초 11주차  (0) 2021.11.14