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 |