프록시 서버란 무엇이며, 왜 "프록시" 라고 합니까? C# 프로그램에서 프록시 서버 링크의 이점은 무엇이며 어떻게 연결합니까?
첫째, 네트워크 에이전트의 이점
대리서비스는 다리 역할을 하며 인터넷 정보의 중계소이다. 네트워크에서 프록시 서비스의 응용 프로그램은 일반적으로 다음과 같은 이유로 인해 발생합니다.
(1) IP 주소 자원을 최대한 활용합니다. Lan 에서 외부 IP 주소는 일반적으로 매우 제한적입니다. LAN 의 호스트가 인터넷 리소스에 액세스할 수 있도록 네트워크 프록시를 통해 수행할 수 있습니다.
(2) 네트워크 보안을 보장 할 수 있습니다. 네트워크 프록시는 인트라넷과 인터넷 사이의 방화벽 역할을 하며 IP 주소를 필터링하여 일부 IP 주소의 외부 리소스에 대한 액세스를 제한할 수 있습니다.
(3) IP 주소와 호스트 이름을 효과적으로 숨길 수 있습니다. 외부 네트워크에 대한 모든 요청은 프록시 서버를 통해 수행되므로 대상 호스트는 프록시 서버의 IP 주소만 알 수 있습니다.
(4) 인터넷 속도를 높이다. 일반적으로 프록시 서버에는 표준 데이터를 저장하기 위한 큰 하드 디스크 버퍼가 있습니다. 동일한 데이터에 다시 액세스할 경우 버퍼에서 직접 정보를 검색하여 액세스 속도를 높일 수 있습니다.
둘째, 네트워크 에이전트의 유형과 구현 원리
작업 계층에 따라 네트워크 프록시 서비스는 일반적으로 애플리케이션 계층 에이전트, 전송 계층 에이전트 및 SOCKS 에이전트로 나눌 수 있습니다. 애플리케이션 계층 에이전트는 애플리케이션을 지원하는 TCP/IP 참조 모델의 애플리케이션 계층에서 작동합니다.
계층 프로토콜 (예: HTTP 및 FTP) 에 대한 에이전트입니다. 최대한의 제어를 제공하지만 유연하지 않으므로 해당 프로토콜에 의해 지원되어야 합니다. 프로토콜이 SMTP 및 POP 와 같은 프록시를 지원하지 않는 경우 응답에만 사용할 수 있습니다.
레이어 아래의 대리자인 전송 계층 프록시를 사용합니다. 전송 계층 에이전트는 TCP 계층과 직접 상호 작용하여 더욱 유연합니다. 프록시 서버에는 특정 TCP 또는 UDP 포트 수신, 클라이언트 수신과 같은 몇 가지 실제 서버 기능이 필요합니다.
동시에 사용자의 요청은 클라이언트에 적절한 응답을 보냅니다. 다른 에이전트는 클라이언트의 IP 스택, 즉 SOCKS 에이전트를 변경해야 합니다. 현재 가장 강력하고 유연한 에이전트 표준 프로토콜입니다. 양말 V4
프록시 서버 내부의 클라이언트는 외부 서버에 완전히 연결할 수 있습니다. SOCK V5 는 클라이언트 인증 및 인증을 추가하여 보안이 높은 에이전트입니다. 이 섹션의 뒷부분에서 설명하는 에이전트는 다음과 같습니다
애플리케이션 계층의 에이전트, 에이전트 프로토콜은 HTTP, 이는 일반적인 웹 에이전트입니다.
위에서 언급했듯이 네트워크 프록시는 클라이언트 (에이전트가 필요한 컴퓨터) 와 서버 (리소스 액세스를 제공하는 서버) 를 연결하는 다리입니다. 이 다리의 기능을 실현하려면 네트워크 프록시가 다음 조건을 충족해야 합니다. 이는 실제로 프록시 서비스가 실행되는 프로세스입니다.
(1) 클라이언트 요청을 수신하고 구문 분석합니다.
(2) 서버에 대한 새 연결을 만들고 클라이언트의 요청 정보를 전달합니다.
(3) 서버 피드백 수신.
(4) 서버의 응답을 해석하여 클라이언트에 보냅니다.
인터넷 프록시에는 많은 장점이 있지만, 네트워크에 대한 모든 요청은 프록시를 사용한 후 프록시 서버라는 브로커를 통해 이뤄지기 때문에 악의를 품고 있는 사람을 만나 당신의 입력을 들을 수 있습니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), 인터넷명언) 마찬가지로 선택한 프록시 서버 대역폭이 비교적 작으면 프록시를 사용해도 네트워크 속도가 느려집니다.
결론적으로, 대리 사용은 장단점이 있으므로 사용자는 자신의 상황에 따라 결정해야 한다. 그러나 좋은 프록시 서버를 선택하는 것이 중요합니다.
셋째, C# 웹 프록시 서비스 프로그램 구현
위의 소개를 통해 대행 서비스에 대한 기본적인 이해가 있어야 한다고 생각합니다. 다음은 C# 을 사용하여 웹 프록시 서비스를 구현하는 방법을 자세히 이해하는 예입니다. 웹 프록시 서비스의 기능 순서는 다음과 같습니다.
(1) 클라이언트 브라우저에서 보낸 웹 요청 정보를 기다리는 수신 포트입니다.
(2) 클라이언트 웹 요청 정보를 수신하면 대상 웹 서버의 주소를 확인하고 소켓 인스턴스를 만들어 웹 서버에 연결합니다.
(3) 만든 소켓을 통해 클라이언트의 웹 요청 패킷을 웹 서버의 80 포트로 보냅니다.
(4) 웹 서버에서 반환 한 페이지 데이터를 수신합니다.
(5) 수신된 데이터를 클라이언트로 전송하여 웹 프록시를 구현합니다.
클라이언트가 웹 주소를 탐색할 때 웹 페이지의 사진 및 플래시와 같은 많은 웹 요청 정보를 전송할 수 있습니다. 이 정보를 더 빠르고 정확하게 처리하기 위해 웹 프록시 서비스가 제공됩니다.
프로그램은 일반적으로 멀티 스레딩을 사용하여 각 웹 요청을 처리합니다. 주의 깊은 독자는 프록시 서버 소프트웨어가 각 클라이언트의 웹 요청 정보를 처리하기 위해 두 개의 소켓을 사용해야 한다는 것을 알 수 있습니다. 하나는
클라이언트 정보를 수신/전송하는 데 사용되며 하나는 웹 서버와 통신하는 것입니다. 이 두 소켓을 구별하기 위해 서버와 통신하는 소켓을 서비스 소켓과 클라이언트라고 합니다.
이 대화를' 고객 콘센트' 라고 합니다.
웹 프록시 서비스 프로그램 작성을 시작합시다. 이 예는 다음 세 부분으로 구성됩니다.
1. 웹 프록시 클래스를 만듭니다.
클래스 2.2 의 인스턴스화. 웹 프록시 서비스.
3. 웹 프록시 클래스의 이 인스턴스를 통해 웹 프록시 서비스를 구현하는 방법
(a) 웹 프록시 클래스 만들기
구체적인 절차는 다음과 같습니다.
1. Visual Studio.Net 을 시작하고 파일, 새로 작성, 프로젝트 순으로 선택한 다음 새 프로젝트 대화 상자에서 프로젝트 유형을 로 설정합니다.
Visual C# 프로젝트, 템플릿을 Windows 응용 프로그램으로 설정, 이름 텍스트 상자에 WebProxy 를 입력하고 위치 텍스트 상자에 을 입력합니다.
"E:VS.NET 프로젝트" 를 누른 다음 "확인" 버튼을 클릭하면 프로젝트가 설정됩니다.
2. 프로젝트 및 클래스 추가 메뉴를 선택하여 신규 항목 추가 대화 상자를 엽니다.
3. 템플리트를 클래스로 설정합니다.
4. 이름 텍스트 상자에' 대리인' 을 입력하고 열기 버튼을 클릭합니다.
5. 솔루션 탐색기 창에서 Proxy.cs 파일을 두 번 클릭하여 Proxy.cs 파일의 편집 필드로 이동합니다.
6. Proxy.cs 소스 파일의 시작 부분에 Proxy.cs 를 가져올 때 사용할 네임스페이스인 다음 코드를 추가합니다.
시스템 사용
System.Net; 사용
시스템을 사용하다. Net. Sockets
시스템을 사용하다. 텍스트;
시스템을 사용하다. 유로파
7. 기본 생성자를 다음 생성자로 바꿉니다. 다음 코드는 프록시 클래스에 생성자를 만듭니다. 프록시 클래스에는 생성자가 하나만 있으며 이 생성자에는 매개 변수가 하나만 있습니다. 이 매개 변수는 주로 클라이언트와 데이터를 교환하는 데 사용되는 소켓 객체로, "클라이언트 소켓" 입니다.
공용 프록시 (소켓 소켓)
{
//
// TODO: 여기에 생성자 논리를 추가합니다.
//
This.clientsocket = 소켓
}
8. 에이전트 클래스를 정의하는 코드 영역에 다음 코드를 추가합니다. 다음 코드는 Proxy 클래스에서 사용되는 몇 가지 변수로, 주로 Run 메서드의 사후 정의에 사용됩니다.
소켓 클라이언트 소켓 (Socket client Socket)
Byte[] read = 새 바이트 [1024];
//클라이언트의 요청 패킷을 저장할 공간을 정의합니다.
Byte [] buffer = null;
인코딩 ASCII = 인코딩. ASCII
//설정 코드
Byte[] RecvBytes = 새 바이트 [4096];
//웹 서버에서 반환한 데이터를 저장할 공간을 정의합니다.
9. 프록시 클래스에 Run 메서드를 생성합니다. 실행 메서드는 프록시 클래스 내의 유일한 메서드입니다. 이 기능은 클라이언트에서 HTTP 요청을 수신하여 웹 서버로 전송한 다음 에서 수행하는 기능입니다.
웹 서버는 피드백 데이터를 받아 클라이언트에 보냅니다. 이 두 가지 다른 측면의 데이터 전송을 위해 Run 메서드는 두 개의 소켓 인스턴스에 의해 구현됩니다. 실행 방법 작성
다음 두 가지 사항을 확인합니다.
(1) HTTP 는 TCP 프로토콜을 기반으로 하기 때문에 생성된 소켓 인스턴스는 TCP 프로토콜을 사용해야 합니다. 다음 코드에서는 웹 서버에 HTTP 요청 명령을 보내고 웹 서버에서 피드백을 받을 수 있는 소켓 인스턴스를 만듭니다.
소켓 IP 소켓 = 새 소켓 (AddressFamily). 인터넷, 소켓 유형. 스트림, 프로토콜 유형 Tcp);
(2) 다른 소켓은 프록시 서버가 포트 번호에서 접속 요청을 수신할 때 얻은 것이므로 이 소켓을 인수로 사용하여 프록시 클래스의 생성자를 사용하여 프록시 인스턴스를 만들어야 합니다. 이 소켓은 클라이언트로부터 HTTP 요청 정보를 받고 데이터를 클라이언트로 전송하는 것을 구현합니다.
소켓을 만들고 사용하는 것은 웹 프록시 소프트웨어를 구현하는 열쇠입니다. 생성자 코드 뒤에 다음 코드를 입력합니다.
공용 유효하지 않은 실행 ()
{
String clientmessage =
//클라이언트의 HTTP 요청 문자열을 저장합니다.
문자열 URL =
//확인 후 주소 요청 정보를 저장합니다.
Int bytes = ReadMessage(read, ref clientSocket, ref client message);
다음 경우 (바이트 == 0)
{
반환;
}
Int index 1 = clientmessage. 인덱스 of ("");
Int index2 = clientmessage 입니다. IndexOf ('',index1+1);
If ((index1= =-1) | | (index 2 = =-1))
{
새로운 ioexception ();
}
문자열 part 1 = clientmessage. 부분 문자열 (index 1+1, index 2-index1);
Intindex3 = part1indexof ('/',index1+8);
Int index4 = part 1. IndexOf ('',index1+8);
Intindex5 = index4-index3;
URL = part 1 입니다. Substring (인덱스1+4, (부품1. 길이-색인 5)-8);
시도하다
{
IPHostEntry IPHost = Dns 입니다. 분석 (URL);
콘솔。 WriteLine ("원격 호스트 이름:" +IPHost. 호스트 이름);
String[]alias = IPHost 입니다. 별칭;
IPAddress[] address = IPHost 입니다. 주소 목록
콘솔。 Writeline ("웹 서버 IP 주소:"+address [0]);
//액세스할 서버의 주소를 확인합니다.
Ip endpoint IP endpoint = new IP endpoint (주소 [0], 80);
소켓 IP 소켓 = 새 소켓 (AddressFamily). 인터넷, 소켓 유형. 스트림, 프로토콜 유형 Tcp);
//웹 서버에 연결된 소켓 개체를 만듭니다.
Ip 소켓. 연결 (IP endpoint);
//웹 서버에 연결된 소켓
If (IP 소켓. 연결됨)
콘솔。 Writeline ("소켓 연결이 정확합니다!" " );
String GET = clientmessage
Byte[] ByteGet = ASCII 입니다. Getbytes (get);
Ip 소켓. Send(ByteGet, ByteGet). 길이, 0);
//프록시 액세스 소프트웨어는 서버에 HTTP 요청 명령을 보냅니다.
Int32 rbytes = IP 소켓. 수신 (수신 바이트, 수신 바이트). 길이, 0);
//에이전트 액세스 소프트웨어는 웹 서버에서 피드백을 받습니다.
콘솔。 WriteLine ("수신된 바이트 수:" +rBytes. ToString()););
String strRetPage = null
StrRetPage = strRetPage+ASCII 입니다. GetString(RecvBytes, 0, rbytes);
While(rBytes & gt;; 0)
{
Rbytes = IP 소켓. 수신 (수신 바이트, 수신 바이트). 길이, 0);
StrRetPage = strRetPage+ASCII 입니다. GetString(RecvBytes, 0, rbytes);
}
Ip 소켓. 닫기 (SocketShutdown). 둘 다);
Ip 소켓. 닫기 ();
Sendmessage (클라이언트 소켓, str retpage);
//에이전트 서비스 소프트웨어는 수신된 정보를 클라이언트로 보냅니다.
}
Catch (예외 exc2)
}
//클라이언트로부터 HTTP 요청 데이터를 수신합니다.
Private int read message (byte [] bytearray, ref Socket s, ref String clientmessage)
{
Int bytes = s.Receive(ByteArray,1024,0);
문자열 messagefromclient = Encoding. Ascii.getstring (bytearray);
Clientmessage = (string) messagefromclient;
바이트를 반환합니다
}
//웹 서버 피드백 데이터를 클라이언트에 보냅니다.
개인 void SendMessage (소켓 s, 문자열 메시지)
{
Buffer = 새 바이트 [메시지. 길이+1];
Int 길이 = ASCII 입니다. GetBytes (메시지, 0, 메시지. 길이, 버퍼, 0);
콘솔。 WriteLine ("전송된 바이트 수:"+길이. ToString()););
남선드 (버퍼, 길이, 0);
}
이제 프록시 클래스 정의 프로세스가 완료됩니다.
(2) 프록시 클래스를 사용하여 웹 프록시를 구현합니다.
다음은 네임스페이스 Web Proxy 에 정의된 프록시 클래스를 사용하여 웹 에이전트를 구현하는 구체적인 단계입니다.
1. Visual Studio 의 코드 편집기에서 Class 1.cs 파일을 엽니다. Net, class 1.cs 의 코드 편집 인터페이스로 들어갑니다 .....
2. 클래스1.cs 소스 파일의 시작 부분에 다음 네임스페이스를 가져옵니다.
시스템 사용
System.Net; 사용
시스템을 사용하다. Net. Sockets
시스템을 사용하다. 텍스트;
시스템을 사용하다. 유로파
시스템을 사용하다. 실을 꿰다
WebProxy 사용
3. 에이전트 클래스를 사용하여 웹 에이전트를 구현하는 Main 함수에 다음 코드를 추가합니다.
Const int port = 8000
//포트 번호 정의
TcpListener TcpListener = 새로운 tcplistener (포트);
콘솔。 WriteLine ("수신 포트 번호:" +port. ToString()););
Tcplistener. 시작 ();
//수신 포트 번호
While (참)
{
소켓 소켓 = tcplistener 입니다. Acceptsocket ();
//및 데이터를 보내고 받는 소켓 인스턴스를 가져옵니다.
Proxy proxy = 새 프록시 (소켓);
//프록시 클래스 인스턴스화
Thread thread = newthread (new threadstart (proxy). 실행);
//스레드 만들기
스레드. 시작 ();
//시작 스레드
}
위의 모든 단계를 저장하면 간단한 웹 에이전트가 완료됩니다. 이 웹 에이전트가 포트 번호 8000 을 수신 중입니다.
(c) 네트워크 코드 프로그램 테스트
웹 에이전트는 두 대의 컴퓨터에서만 구현할 수 있습니다. 한 컴퓨터는 웹 프록시를 웹 프록시 서버로 실행하고 다른 컴퓨터는 웹 프록시 서버를 통해 웹 페이지를 탐색하는 클라이언트입니다. 웹 프록시 소프트웨어가 실행 중인지 확인한 후 클라이언트에 필요한 설정을 지정해야 합니다.
1. IE 브라우저를 엽니다.
2. "도구", "인터넷 옵션" 을 차례로 선택하고 팝업 "인터넷 옵션" 대화 상자에서 "연결" 페이지를 선택한 다음 "LAN 설정" 버튼을 클릭하여 재생합니다.
LAN (local area network) 설정 대화 상자가 나타나고 LAN (X) 에 프록시 서버 사용, (전화 접속 및 VPN 연결에는 적용되지 않음) 다중 선택 확인란을 선택한 다음 주소 텍스트 상자에 있습니다.
포트 에'10.138.198.213' 과 같은 프록시 서버의 IP 주소를 입력합니다
이제 클라이언트 설정이 완료되었습니다. IP 주소가 "10.138.198.213" 인 컴퓨터에서 이러한 웹 에이전트가 이미 실행 중인지 확인한 후 :
넷째, 요약
이로써 간단한 웹 프록시 서비스 소프트웨어가 기본적으로 완성되었다. 대리서비스의 실현 원리는 비교적 간단하지만 구체적인 실현은 여전히 복잡하다. 인터넷 에이전트는 내용이 풍부하고 복잡한 이론을 실현하는 것이다.
문제, 이 섹션에서 설명하는 프록시 서비스 소프트웨어는 프로토콜 유형 또는 구현된 기능 중 일부에 불과합니다. 이 글의 소개를 통해 다른 관련 지식과 결합하여 공헌할 수 있기를 바랍니다.
더 강력하고, 안전하며, 더 안정적인 네트워크 에이전트 서비스 프로그램을 사용할 수 있습니다.