네트워크 기본 구조와 원리
- 프로토콜(protocol) : 인터넷 상에서 컴퓨터 간의 데이터를 주고 받기 위한 약속된 형식 ⇒
통신규약
- OSI 7 계층 : 컴퓨터 네트워크 프로토콜 디자인과 통신을 계층으로 구분하여 규정
⇒ 프로토콜을 기능별로 구분
- 서버(Server) : 클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 또는 프로그램
- 클라이언트(Client) : 네트워크를 통하여 서버라는 다른 컴퓨터 시스템 상의 원격 서비스에 접속할 수 있는 응용 프로그램 또는 사용자 컴퓨터
주요 네트워크 프로토콜과 표준
- TCP/IP (Transmission Control Protocol/Internet Protocol)
- 인터넷에서 가장 일반적으로 사용되는 프로토콜
- TCP는 신뢰성 있는 데이터 전송을 담당
- IP는 패킷 라우팅과 주소 지정을 처리
- HTTP (Hypertext Transfer Protocol)
- 웹 페이지 요청과 응답을 처리하기 위한 프로토콜
- 클라이언트가 서버에 요청, 서버는 요청에 대한 응답
- HTTPS (Hypertext Transfer Potocol Secure)
- HTTP 보안 버전
- 인증서를 사용하여 데이터의 안정성과 개인 정보 보호를 강화
- DNS (Domain Name System)
- 도메인 이름과 IP 주소 간의 변환을 처리하는 프로토콜
- SMTP (Simple Mail Transfer Protocol)
- 이메일의 전송을 처리하기 위한 프로토콜
네트워크 계층 전송 방식
유니캐스트
: 고유 주소로 식별된 하나의 네트워크 목적지에 1:1로 트래픽 또는 메시지를 전송하는 기술
멀티캐스트
: 하나 이상의 송신자들이 특정한 하나의 이상의 수신자들에게 데이터를 전송하는 기술
브로드캐스트
: 하나의 송신자가 같은 서브 네트워크 상의 모든 수신자들에게 전송하는 기술
애니캐스트
: 하나의 송신자로부터 토폴리지상의 잠재적인 수신자 그룹 안에서 가장 가까운 노드로 데이터그램을 전송하는 기술
TCP/IP 서버와 클라이언트
TCP/IP
모델
- Link Layer
디지털 데이터를 물리적인 전송매체로 보내는 변환/변조 그 신뢰성을 확보하는 처리를 수행
- Internet Layer
수신지가 되는 컴퓨터까지 통신 경로를 확보하는 처리를 수행
- Transport Layer
애플리케이션을 식별하고 그에 따라 통신을 제어
- Application Layer
사용자가 직접적으로 이용하는 애플리케이션의 네트워크 통신을 제어하는 처리를 수행
3Way HandShaking
1step : 클라이언트는 서버에 접속하기 전에 접속할 것을 미리 서버에게 신호를 보낸다.
2step : 수신한 서버는 클라이언트부터 접속에 대한 요청을 받았음을 클라이언트에 발송한다.
3step : 클라이언트는 서버로부터 자신의 요청이 수신되었음을 확인하고, 수신확인 메시지를 전송한 후 서버와의 통신을 시작한다.
- 전송계층 (OSI 모델)
- 운영체제의 일부로 구현되어 있음
- 전송 방식
- TCP(Transmission Control Protocol) : 에러검출, 재전송 등 데이터 신뢰성
- UDP : 빠른 전송
TcpListener 클래스 메소드
시작 | Start() | TcpListener 개체를 수신 대기 상태로 만듭니다. |
중지 | Stop() | TcpListener 개체를 중지합니다. |
연결 수락 | AcceptTcpClient() | 클라이언트에서 연결 요청을 수락하고 연결된 TcpClient 개체를 반환합니다. |
연결 대기 | Pending() | 연결을 수락할 수 있는 클라이언트가 있는지 여부를 나타내는 값을 반환합니다. |
TcpClient 클래스 메소드
연결 | Connect(string,int) | 지정된 호스트와 포트 번호로 TCP 서버에 연결합니다. |
네트워크 스트림 | GetStream() | NetworkStream 개체를 반환하여 TcpClient와 연결된 네트워크 스트림을 가져옵니다. |
소켓 닫기 | Close() | TcpClient와 연결된 소켓을 닫습니다. |
TCP 서버와 클라이언트
- TCP 서버의 기본 구조
- 대가상태 → 접속요청 → 데이터 전송
- TCP 서버와 클래스
- TcpListener : 연결과 TcpClient 객체 생성
- TcpClient : 데이터 전송, 클라이언트 영역과 서버 영역이 데이터를 주고 받을 수 있도록 하는 객체
- NetworkStream : TCP Client 객체가 1:1로 연결된 상태에서, 데이터를 주고 받을 수 있도록 과정을 구현
- TCP 서버와 다수의 클래스
UDP 서버와 클라이언트
- UDP 서버와 클래스
- 비연결형
- 클라이어트에서 어떠한 데이터를 보내면, UDP 서버는 즉각적으로 반응
- ip 주소와 port 번호를 알면 데이터 전송 가능
- 서버와 클라이언트 모두 사용
- 그룹처리
Buffer
TCP는 통신시 데이터를 효율적으로 전송하기 위해 버퍼라고 하는 임시 데이터 공간을 사용
소켓 버퍼 동작 구조
- 클라이언트에서 서버에 보낼 데이터를
write
한다.
- 데이터가 클라이언트의 송신 버퍼에
적재
한다.
- 적재된 데이터가 서버의 수신 버퍼에
전송
한다.
- 서버가 수신버퍼에 적재된 데이터를
read
한다.
- 서버에서 클라이언트에게 응답할 데이터를
write
한다.
- 데이터가 서버의 송신버퍼에
적재
된다.
- 적재된 데이터가 클라이언트의 수신 버퍼에
전송
된다.
- 클라이언트가 수신버퍼에 적재된 데이터를
read
한다.
응용프로그램이 갑작스럽게 종료되어 세션이 끊긴다면 버퍼에 남아있는 데이터들은 어떻게 되는것일까?
Proxy(프록시)
‘대리’,’대신’이라는 뜻을 가지며, 프로토콜에 있어서는 대리 응답 등에서 사용하는 개념이다.
- 클라이언트와 서버 사이에 존재하며, 중계기로서 대리로 통신을 수행하는 것을 proxy라고 하며, 그 중계 기능을 하는 주체를 Proxy Server라고 한다.
프록시 서버의 종류
포워드 프록시(Forward Proxy)
- 기본적인 프록시
- Client와 Server 사이에 위치하여 요청을 중계하며, 요청과 응답은 Proxy Server를 거친다.
- 클라이언트를 감추는 효과가 있다.
리버스 프록시(Reverse Proxy)
- 포워드 프록시와 다르게 Server들이 주로 내부망으로 구서오디며 프록시에게만 연결을 허용
- 서비스를 위한 보안 채널을 구축
- Client가 Server에 직접 접근이 불가능하므로, Reverse Proxy에서 요청을 적극적으로 중계하는 Loading Balancing(컴퓨터 자원들에게 작업을 나누는것을 의미)의 역할을 수행하기도 함
프록시 서버를 사용하는 이유
- 개인정보를 보호할 수 있다.
- 캐시를 사용해서 속도가 향상된다.
- 로그를 기록,관리할 수 있다.
- 접속을 우회할 수 있다.
HTTP
상태는 없고 세션이 있다.
headers
- Host : 요청하려는 서버 호스트 이름과 포트번호
- User-agent : 클라이언트 프로그램 정보
- Referer : 바로 직전에 머물렀던 웹 링크 주소
- Accept : 클라이언트가 처리 가능한 미디어 타입 종류 나열
- If-Modified-Since : 여기에 쓰여진 시간 이후로 변경된 리소스 취득
- Authorization : 인증 토큰을 서버로 보낼 때 쓰이는 Header
- Origin : 서버 Post 요청을 보낼 때 요청이 어느 주소에 시작되었는지 나타내는 값
- Cookie : 쿠키 값
Socket
네트워크 소켓은 컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점
bind() 시스템 콜
생성한 소켓에 실제 아이피 주소와 포트 번호를 부여하는 시스템 콜
- 파라미터에 소켓의 파일 디스크립터를 포함
- bind() 시스템 콜은 서버에서만 사용
listen() 시스템 콜
연결 요청을 받아들이는 시스템 콜
- TCP에서만 사용
- 최대로 받아주는 크기를 backlog로 설정 = TCP 백로그 큐의 크기
accpet() 시스템 콜
backlog qeue에서 syn을 보내와 대기 중인 요청을 선입선출로 연결해줌
- 클라이언트의 주소 정보
서버
- 소켓 생성
- 바인딩(ip, port번호 설정)
- listen()으로 클라이언트 요청에 대기열을 만들어 몇개의 클라이언트를 대기시킬지 결정
- accept()로 클라이언트와 연결
- 데이터 송수신
- 소켓 닫기
클라이언트
- 소켓 생성
- 서버에 설정된 ip, port로 연결 시도
- accpet()로 클라이언트의 socket descriptor 반환
- 데이터 송수신
- 소켓 닫기
스트림 소켓
- TCP(Transmission Control Protocol)을 사용하는 연결 지향방식의 소켓
- 송수신자의 연결을 보장하여 신뢰성있는 데이터 송수신 가능
- 데이터의 순서 보장
- 소량의 데이터보다 대량 데이터 전송에 적합
- 점대점 연결
데이터그램 소켓
- UDP(User Diagram Protocol)을 사용하는 비연결형 소켓
- 데이터의 순서와 신뢰성을 보장하기 어려움
- 점대점 뿐만 아니라 일대다 연결도 가능
웹소켓
HTTP 통신을 이용하면 클라이언트에서 서버에 요청을 보내야만 서버에서 응답을 하는데 서버에서 요청을 받지 않으면 통신이 안된다. 이러한 문제점을 해결하기위해서 양방향 통신이 가능한 웹 소켓 통신을 이용해야함
- 최초 접속시에만 http 프로토콜 위에서 handshaking을 하기 때문에 http header를 사용
- 웹소켓을 위한 별도의 포트는 없고, 기존 포트를 사용
- 프레임 으로 구성된 메시지라는 논리적 단위로 송수신
- 메시지에 포함될 수 있는 교환 가능한 메시지는 텍스트와 바이너리 뿐