1120-TIL

그로밋·2023년 11월 20일
0

krafton jungle

목록 보기
33/58

Socket

socket이란 네트워크 상에서 돌아가는 두 개의 프로그램 간 양방향 통신의 하나의 엔트 포인트

논리적 의미로 컴퓨터 네트워크를 경유하는 프로세스간 통신의 종착점(end-point). 즉, 네트워크를 이용해 데이터 송수신을 하고자 하는 모든 프로그램들은 소켓을 거쳐야만 한다.

Socket은 OSI 7L에서 7th layer인 application layer와 transport layer사이에서 데이터를 전달한다.

위 그림에서 모든 application은 socket descripto를 가지고 있는 것을 볼 수 있다.

port란 각각의 응용 프로그램에 이미 정해져있는 포트 번호를 이용하여, 전송 계층에서 응용프로그램을 구분 하는 것.

socket 특징

server-client 구조

TCP/UDP 위에서 동작하니 당연하게 ser-cli 구조를 갖춤

양방향 통신

socket은 한쪽에서 데이터를 보내고 연결이 끊어지는 통신이 아니라 양 쪽에서 실시간으로 데이터를 송수신 할 수 있음. 그래서 실시간 스트리밍이나 채팅에 유용하게 사용됨

의문 : 근데 이 말은 stream sockets 한정 인가요?

프로그래밍 언어나 운영체제에 종속적

socket은 TCP/IP 표준이 아니라 네트워크 프로그래밍 인터페이스임. 따라서 운영체제별로 사용법이 약간씩 다르고, 또 그 안에서 프로그래밍 언어마다 소켓 aip를 구현한 라이브러리가 다 다름.

socket 종류

Stream sockets - TCP (Transmission Control Protocol)

  • tcp를 사용하므로 연결 지향형
  • 신뢰성 보장
  • 데이터의 순서 보장
  • 점대점 연결

위는 아래 교재의 소켓 인터페이스를 좀 더 이해하기 쉽게 나타낸 그림이다.
여기서 알 수 있는 것 가장 큰 것은,

교재 그림 client의rio_writensend이고 그 요청을 받는 server의 rio_readlinebrecv이다.(그 밑에는 반대)

server

  1. socket() : 소켓 생성

    여기서 생성하는 소켓은 bind하고 listen 해서 새로운 클라이언트의 요청을 대기하는 목적이라 연결 이후에 또 다른 클라이이언트의 요청을 기다리는 친구다. 실질적인 소켓은 아래 accept에서 함

  2. bind() : 사용할 IP address와 Port number 등록

  3. listen() : 연결되지 않은 소켓을 요청 수신 대기 모드로 전환

  4. accept() : client의 요청 수락 후 실질적인 소켓 연결 -> 통신을 위한 새로운 소켓 생성

    여기서 실질적인 소켓을 어떻게 연결한다는 건지 추후 코드를 통해 알아볼 수 있을 것 같다.

  5. close() : 클라이언트로부터 EOF 을 받으면 소켓을 닫는다.

client

  1. socket() : 마찬가지로 소켓 생성
  2. connect() : Client에서 Server와 연결하기 위해 following 들을 지정함. socket, 목적지IP address, Port number
  3. close() : 요청을 끝낼 때 EOF을 서버에게 보내고 소켓을 닫는다.(맞나?)

Datagram sockets - UDP (User Datagram Protocol)

  • UDP를 사용하므로 비 연결형 소켓
  • 신뢰성 보장x
  • 데이터 순서 보장x
  • 1:1 as well as 1:N
  • connect() 과정 필요 없어서 소켓 생성한 후 바로 데이터 전송
  • 주로 1:N 통신에 많이 쓰임

그림 출처/참고

port number tmi - well known port

21 : FTP : File Transfer Protocal : 파일 전송 프로토콜 : 서버와 클라이언트 사이의 파일 전송을 하기위한 프로토콜
22 : SSH : Secure Shell : 시큐어 셀 : 다른 사용자가 세션을 엿듣지 못하도록 세션을 감싸 보안 및 안정성을 높임. 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해 주는 프로토콜. Linux 계열에서 사용함.
23 : TELNET : 텔넷 :
25 : SMTP : Simple Mail Transfer Protocol : 전자우편을 보낼 때 이용하는 프로토콜
53 : DNS : Domain Name System : 영문/한글 주소를 네트워크에서 찾아갈 수 있는 IP로 변환해 준다.
Web
61 : SNMP : Simple Network Management Protocol
80 : HTTP : HyperText Transfer Protocao
110 : POP3 : Post Office Protocol version 3
115 : SFTP
143 : IMAP : Internet Messaging Access Protocal
443 : HTTPS(SSL) : HyperText Transfer Protocol over Secure Socket Layer : 월드와이드웹 통신 프로토콜인 HTTP의 보안이 강화된 버전
3389 : RDP : 윈도우 PC 원격데스크탑 연결
출처: https://sevendollars.tistory.com/43 [SevenDollars:티스토리]

File Descriptor

유닉스 시스템에서는 모든걸 파일이라고 한다는 요상한 말을 들어보았다. 리눅스는 일반적인 정규파일부터 디렉토리, 소켓, 파이프, 블록 디바이스, 케릭터 디바이스 등 모든 객체들을 파일로 관리한다.

프로세스가 실행 중에 파일을 Open하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중 사용하지 않는 가장 작은 값을 할당해준다. 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, 파일 디스크립터(FD)값을 이용해서 파일을 지칭할 수 있다.

참고

Datagram/Stream socket

스트림 소켓은 전화 통화와 같습니다. 한 쪽이 전화를 걸고, 다른 대답은 서로에게 인사하고 (TCP의 SYN / ACK) 정보를 교환합니다. 끝나면, 작별 인사 (TCP에서 FIN / ACK)라고 말합니다. 한쪽에서 작별 인사를 듣지 않으면 예상치 못한 이벤트이므로 다른 쪽에서 다시 전화를 겁니다. 일반적으로 클라이언트는 서버에 다시 연결합니다. 데이터가 전송 된 순서와 다른 순서로 도착하지 않을 것이라는 보장이 있으며 데이터가 손상되지 않을 것이라는 합리적인 보장이 있습니다.

데이터 그램 소켓은 클래스에서 노트를 전달하는 것과 같습니다. 메모를 전달하는 사람 옆에 직접 있지 않은 경우를 생각해보십시오. 메모는 사람과 사람 사이를 여행하게됩니다. 도착지에 도착하지 않을 수 있으며 도착할 때까지 수정 될 수 있습니다. 같은 사람에게 두 개의 노트를 전달하면 노트가 교실을 통과하는 경로가 같지 않을 수도 있고, 한 사람이 다른 사람처럼 빨리 노트를 통과하지 못할 수도 있으므로 의도하지 않은 순서로 도착할 수도 있습니다.
출처

Web contents(MIME type, 정적, 동적, CGI), HTTP, Proxy)

CGI(Common Gateway Interface, CGI)

CGI 용어 정의 n 이해

CGI는 말그래도 인터페이스이다. 라이브러리나 함수가 아니다. 한줄 정의는 외부 프로그램을 띄워서 그 결과값을 반환하는 방식에 대한 규약. 즉, 동작방식이나 특정 프로그램을 지칭하는 것이 아닌 데이터를 주고 받는 표준적인 규약이라고 보는게 맞다.출처

즉, CGI는 Information server(Information server의 가장 대표적인 예는 웹서버.)와 외부 application과의 interface를 위한 표준 방법.

등장배경

일반 HTML문서가 웹서버를 통해 서비스되면 -> 정적페이지
즉, 웹프로그래머가 문서를 직접 수정하기 전에 모든 웹서퍼들은 어떤 시간에 문서를 보더라도 동일한 문서를 보게 됨.

2000년도 중반까지만 해도 이런 방식으로 웹서비스를 제공해도 괜찮았는데 이제는 동적으로 고객의 정보를 확인해서 고객마다 각 다른 정보를 지닌 페이지를 뿌려줘야하는 서비스가 필요해졌다.-> 동적페이지.

CGI는 이러한 동적 페이지 서비스를 위해 만들어짐.
참고

CGI Program 용어 정의 n 이해

CGI를 위해 쓰이는 외부 프로그램을 통상 CGI 프로그램이라 한다.
이전에는 CGI Program을 작성하는데 shell Script와 perl이 많이 사용되었기 때문에 CGI Script라고 부르곤 했습니다. 그러나 이제는 (CGI규격만 지킨다면) C/C++, PHP, Python, Ruby 등 모든 언어를 사용할 수 있습니다.

tmi - 과거에 CGI를 위해 PHP같은 스크립트 언어가 많이 사용되었던 이유가 여기에 있다. C or C++은 개발 후 컴파일 시켜서 제대로 실행되는지 테스트 해야하는데 Perl이나 Shell or PHP 같은 스크립트 언어는 컴파일 시키지 않아도 되서 좀 더 편하게 프로그래밍이 가능한 부분이 있기 때문이다.

CGI Programs 이해


  • CGI프로그램은 웹서버에 의해서 모듈 혹은 프로그램 형태로 실행되며, 데이터베이스에 연결해서 데이터를 읽어와서 웹페이지로 출력하거나, 데이터를 저장하는 등의 일을 한다.

  • CGI는 기본적으로 당신의 시스템에서 실행되어지는 프로그램으로 다른 프로그램(vi, ls ..)들과 전혀 다를바가 없다. 다른 프로그램들이 출력결과를 표준출력을 통해서 전달하는 것과는 달리 CGI는 출력결과를 웹서버로 전달한다는 정도만 약간 다르다고 보면 된다.

CGI 장점

  • 언어, 플랫폼 독립적이다(스펙만 준수하면 된다).
  • 매우 단순하고 다른 server-side 프로그래밍 언어에 비해 advanced task를 훨씬 쉽게 수행할 수 있다.
  • 재사용할 수 있는 CGI 코드 라이브러리가 풍부하다.
  • CGI가 웹서버에서 실행될 때 안전하다.
  • CGI 코드를 수행하는데 특정 라이브러리가 필요하지 않기 때문에 매우 가볍다.

CGI 단점

  • 느리다(요청이 올 때마다 DB connection을 새로 열어야 한다).
  • HTTP 요청마다 새로운 프로세스를 만들기 때문에 서버 메모리를 많이 잡아먹는다.
    (servlet은 요청마다 스레드를 만든다.)
  • 페이지 로드 사이에 데이터가 메모리에 캐시될 수 없다.

이러한 단점들로 등장한게 Servlet이다.
"Servlet이란 Java를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말합니다."

출처

위에 출처 표시 외의 References
wiki
CGI 관련
Servlet 관련

profile
Work as though your strength were limitless. <S. Bernhardt>

0개의 댓글