소켓

sally·2022년 3월 26일
0

네트워크

목록 보기
1/1

소켓 : 프로토콜 명세서를 코드로 구현

  • 인터넷과 소프트웨어 사이에 놓여 소프트웨어들을 연결
  • 소켓의 함수들 : 인터넷에서 소켓 찾아 연결, 데이터 읽고 보내는 함수들
  • 서비스 포트
    • 각 네트워크 프로그램들이 할당 받는 포트번호를 통해 서비스 프로그램을 찾아간다.
      • apache web server : 80 port
      • FTP : 21
      • ssh : 22
      • telnet : 23
      • SMTP(email) : 25
    • 포트 번호 크기 : 2byte (1 ~ 65536)
      • 이중 1 ~ 1024 = 시스템 포트 (root 권한 사용자만 사용)
        • 80번 포트 웹서버 실행 ? root 권한 가진 사용자

HTTP 는 단방향, 소켓통신은 양방향?

인터넷 찾아보면 흔히 보이는 내용인데, 소스 코드를 보니 이해가 안 된다.
HTTP 요청을 받고, 소켓을 사용하기 때문이다.

Microsoft Docs - Socket 클래스

  • 프로토콜을 어떻게 활용하느냐에 따라 연결 지향과 비연결 프로토콜로 바뀔 수 있다.
    • 먼저, IP, HTTP 는 비연결 프로토콜이다.
    • IP 프로토콜을 이용하는 TCP 프로토콜은 연결지향 프로토콜이다.
    • 비연결 프로토콜인 HTTP는 TCP 프로토콜을 이용한다.

HTTP over TCP/IP

HTTP Basics

  • 웹브라우저의 URL을 통해 요청하면,
  • 내가 적지 않은 요청내용이 담겨져 있다.
    • 브라우저가 지정된 프로토콜에 따라 URL을 요청 메시지로 전환한 내용이라고 한다.
    • 응답 헤더에 코드상 적은 내용들이 담겨져 있는걸 확인

URL 요청에서 응답까지의 과정은 어떻게 됐을까?

  • URL을 다시 보면, localhost:8080
    • 도메인 : localhost
    • 포트 번호 : 8080
  • 두 가지만으로 소스 코드에 Socket 커넥션과 응답헤더 처리까지 진행 할 수 있었다.

HTTP

클라이언트-서버 응용 프로그램 수준 프로토콜

  • HTTP는 TCP/IP에서만 실행가능한게 아니라, 신뢰할 수 있는 전송 가정하에, 이러한 보장을 제공하는 모든 전송 프로토콜을 사용할 수 있다.

TCP/IP(전송 제어 프로토콜/인터넷 프로토콜)

시스템이 네트워크를 통해 서로 통신하기 위한 전송 및 네트워크 계층 프로토콜 집합

  • IP (인터넷 프로토콜)
    • 네트워크 주소 지정 및 라우팅을 처리하는 네트워크 계층 프로토콜
    • IP 네트워크 각 시스템에는 고유한 IP 주소(예: 165.1.2.3)가 할당되며, IP 소프트웨어는 원본 IP에서 대상 IP로 메시지를 라우팅하는 역할
    • IPv4 (IP 버전 4)
      • IP 주소는 4바이트로 구성되며 각 범위는 0에서 255까지로 네트워크에서 최대 4G 주소를 지원
  • DNS(Domain Name Service)
    • 도메인 이름을 IP 주소로 변환
    • 특수 IP 주소 127.0.0.1 = 도메인명 localhost
      (항상 자신의 컴퓨터 참조)
  • TCP
    두 시스템 간의 연결을 설정하는 전송 계층 프로토콜
    • 2가지 프로토콜 : TCP, UDP(User Datagram Package)
    • 신뢰 할 수 있다.
    • 각 패킷에는 시퀀스 번호가 있으며, TCP에서 패킷 전달 보장
      • 수신자가 패킷을 수신하지 않으면 패킷 재전송
    • IP 시스템 내에서 응용 프로그램을 다중화
      • 각 IP 시스템에 대해 TCP는 포트 번호 0에서 65535까지 최대 65536개의 포트(또는 소켓)를 지원(다중화)
      • 포트 0 ~ 1023은 널리 사용되는 프로토콜(예: HTTP 80, FTP 21, Telnet 23, SMTP 25, NNTP 119, DNS 53)에 미리 할당
    • TCP 포트 80이 HTTP에 미리 할당되어 있지만 기본 HTTP 포트 번호로 8000, 8080과 같은 다른 사용자 할당 포트 번호(1024-65535)에서 HTTP 서버를 실행하는 것도 가능하다.
      • URL에 포트 번호를 명시적으로 지정
      • 즉, TCP/IP 통신 위해서는 IP와 포트번호를 알면 된다.
  • UDP
    • 패킷전달을 보장하지 않는다.
    • 오벗헤드가 적다
    • 비디오 및 오디오 스트리밍과 같은 애플리케이션에 사용


(이미지 출처 : https://whatsup95.tistory.com/19)


실습예제

위에서 TCP/IP 통신 위해서는 IP와 포트번호를 알면 된다고 했다.
ServerSocket에 port 번호만 할당 했는데?

  • 처음에는 ServerSocket에 addr=0.0.0.0/0.0.0.0으로 생성
 public ServerSocket(int port) throws IOException {
        this(port, 50, null);
    }

  • accept() 대기 상태에서 클라이언트 요청으로 생성시킨 소켓(Socket)에 위임
    • TCP의 포트 영역 0 ~ 0xFFFF (0 ~ 65535) 범위
    • InetSocketAddress 에서 0:0:0:0:0:0:0:1 할당
  • PlainSocketImpl의 socketAccept(SocketImpl s)

    • 잘 모르겠으니 그냥 따라가 보면
      • InetAddress로부터 가져오는데, Socket Address의 IP 주소를 가진 객체로 보이며, port만 기입시에는 로컬정보로 가져온 걸 볼 수 있었다.


  • 소스를 분석하고자 하니 복잡해 보였지만, 정의되어진 프로토콜에 맞춰 로직들이 돌아가는 소스들이라는 점은 좀더 익숙해질 수 있을것 같았다.

소켓 네트워크 프로그래밍에 대한 이해
HTTP basics

profile
sally의 법칙을 따르는 bug Duck

0개의 댓글