230 likes | 552 Views
Chapter 3 TCP Socket. 소켓 프로그래밍. TCP Socket. TCP 개념 TCP 소켓 프로세스 흐름 TCP Server TCP Client 데이터 인코딩 예제 프로그램 실습. TCP 개념. Transmission Control Protocol (RFC 793) 연결 지향형 소켓 TCP 세그먼트 헤더 포맷. TCP 개념. 연결 지향형 소켓 통신을 위해 접속을 성립 하위 계층의 IP 가 신뢰성을 보장하지 않는 패킷교환 기술을 사용하기 때문
E N D
Chapter 3TCP Socket 소켓 프로그래밍
TCP Socket • TCP 개념 • TCP 소켓 프로세스 흐름 • TCP Server • TCP Client • 데이터 인코딩 • 예제 프로그램 실습
TCP 개념 • Transmission Control Protocol (RFC 793) • 연결 지향형 소켓 • TCP 세그먼트 헤더 포맷
TCP 개념 • 연결 지향형 소켓 • 통신을 위해 접속을 성립 • 하위 계층의 IP가 신뢰성을 보장하지 않는 패킷교환 기술을 사용하기 때문 • Three-way handshake를 통한 접속 • 클라이언트는 SYN(동기화 플래그)을 1로 설정, 시퀀스 번호 필드에 랜덤번호를 채운 TCP 세그먼트를 서버로 보내 접속 요청을 개시 • 서버는 클라이언트로부터 받은 세그먼트의 SYN을 검사한 후, SYN, ACK 플래그를 1로 설정, 확인응답번호 필드에 클라이언트가 보낸 시퀀스 번호에서 1만큼 증가시킨 번호를 넣고, 시퀀스 번호는 랜덤으로 채워 클라이언트에게 응답 세그먼트를 보냄 • 클라이언트는 다시 서버가 보낸 응답 세그먼트의 시퀀스 번호에서 1만큼 증가시킨 번호를 확인응답번호 필드에 넣고, ACK 플래그를 1로 설정하여 서버로 응답하여 접속을 성립
TCP 개념 • Three-way handshake
TCP 소켓 프로세스 흐름 • 서버 • 리스닝 소켓은 접속 성립 시에 새로운 소켓을 생성하기 때문에 접속이 성립된 후에도 리스닝 상태에 남아있게 되는 특징을 가짐
TCP 소켓 프로세스 흐름 • 클라이언트 • Three-way handshake를 통해 서버로의 접속을 시도 • 접속 요청이 수락되면, 서버는 클라이언트와의 통신을 위한 새로운 소켓을 생성
TCP 소켓 프로세스 흐름 • Netstat명령 • 접속이 성립된 후 netstat명령을 이용하여 프로토콜의 상태정보를 확인 가능
TCP 서버 대기 TCP 서버 클라이언트 접속 TCP 클라이언트 #1 TCP 서버/클라이언트 동작 원리 (1/3) • TCP 서버/클라이언트 동작 원리
TCP 서버 대기 통신 통신 TCP 서버 TCP 클라이언트 #1 TCP 클라이언트 #2 대기 통신 TCP 클라이언트 #1 TCP 서버/클라이언트 동작 원리 (2/3)
TCP 서버 . . . . . . 대기 TCP 클라이언트 #1 . . . . . . TCP 클라이언트 #n TCP 서버/클라이언트 동작 원리 (3/3)
TCP 서버 • 예제 프로그램 : EchoServerTCP.cs • TcpListener 클래스 • TcpListener클래스 생성자 public TcpListener(int) public TcpListener(IPEndPoint) public TcpListener(IPAddress, int)
TCP 서버 • TcpListener 클래스 • 리스닝 시작과 관련된 메서드 public void Start() public void Start(int) • TcpListener 객체를 리스닝 상태로 만들고 접속 요청을 수락할 준비를 함 • 두 번째 메서드의 경우, 인자는 접속 요청이 대기할 수 있는 최대 큐의 길이를 의미 • 접속 수락과 관련된 메서드 public TcpClientAcceptTcpClient() • Socket클래스의 Accept()메서드와 유사함 • Accept()가 Socket객체를 반환하는 것과는 달리 TcpClinet 형으로 반환 • 리스닝 중지 public void Stop()
TCP Client • 예제 프로그램 : EchoClientTCP.cs • TcpClient클래스 • TcpClient클래스 생성자 public TcpClient() public TcpClient(AddressFamily) public TcpClient(IPEndPoint) public TcpClient(string, int) • 디폴트 생성자인 첫 번째 생성자는IPv4 주소 설정이 포함된 객체를 생성하므로 다른 주소 스키마를 사용하고자 한다면 열거형인AddressFamily값을 인자로 받는 두 번째 생성자를 사용 • 마지막 생성자는 문자열 IP주소가 입력되면 자동으로 IP주소로 해석
TCP 클라이언트 • NetworkStream클래스 public NetworkStreamGetStream() • TcpClient 클래스의 GetStream()메서드는 접속이 성립된 후 데이터의 송수신을 위한 NetworkStream객체를 반환 • 데이터 송수신 public override int Read(byte[], int, int) public override void Write(byte[], int, int) • 데이터를 저장하거나 가져오기 위한 Byte[] 배열 • 두 번째 인자는 버퍼에서 읽기/쓰기를 시작할 위치를 지정 • 마지막 인자는 읽기/쓰기를 수행할 최대 데이터의 길이 • Read()메서드는 호출된 후 읽은 데이터의 바이트 수를 반환
데이터 인코딩 • 예제 프로그램 : CharEncoding.cs • Echo 예제 프로그램의 GetBytes(), GetString()메서드 • 데이터를 보내기 전에 바이트 형태로 바꾸고, 데이터를 받은 후 다시 문자열 형태로 변환 • 메시지는 네트워크에서 한 번에 1바이트씩 보내어짐 • ASCII
데이터 인코딩 • Unicode • 32비트 • Unicode의처음 128개의 코드 포인트들은 ASCII와의 호환성을 위해 동일한 문자코드를 가짐 • 코드 포인트들은 서로 다른 Plane로 분류될 수 있음 • 가장 흔히 사용되는 문자들은 Basic Multilingual Plane (BMP)로 알려져 있는 Plane 0에 포함 • BMP코드 안의 문자들은 0에서 FFFF (16진수)의범위를 가짐 • 이 영역내의 문자를 사용하기에 16비트면 충분 • 이러한 특징으로 인해 전송효율을 위한 Unicode Transformation Format (UTF)를 제안
데이터 인코딩 • Unicode
데이터 인코딩 • UTF-32 • 앞부분의 비트들을 0으로 채워 32비트 포맷으로 코드 포인트를 직접적으로 표현한 가장 간단한 방식 • 처음 11개의 비트가 모두 0으로 표현되기 때문에 가장 비효율적임 • BMP 내의 문자들만을 사용할 경우 처음 16개의 비트가 항상 0으로 채워짐 • UTF-16 • 가장 널리 이용됨 • BMP 내의 문자들을 사용할 경우 16비트로 표현되며, 그 외의 문자들에 대해서는 32비트로 표현될 수 있음 • UTF-8 • 웹 페이지나 XML 문서와 같은 네트워크 응용에서 흔히 사용 • 네트워크에서 한 번에 1바이트씩 전송하는 것에 착안
데이터 인코딩 • .NET 프레임워크는 각 인코딩(ASCII, UTF-8, UTF-16, UTF-32, UTF-7)에 대한 라이브러리를 System.Text네임스페이스의 Encoding 클래스에 포함하고 있음 • GetBytes()메서드 • 입력된 데이터를 목적 인코딩 스키마의 바이트 인코딩으로 변환 • GetString()메서드 • 바이트 데이터를 목적 인코딩 스키마의 문자열 포맷으로 변환
예제 프로그램 실습 • 대문자 변환 프로그램 • UppercaseServer.cs, UppercaseClient.cs • 채팅 프로그램 • ChatServer.cs, ChatClient.cs • 파일 전송 프로그램 • FileServer.cs, FileClient.cs