티스토리 뷰

Network

Network - 소켓통신

Hackerrior 2017. 3. 24. 15:26 댓글확인

Network - 소켓 통신


  네트워크 프로그래밍


   - 원격지의 호스트들 사이에 서로 데이터를 주고 받을 수 있도록 프로그램을 구현


  소켓


   - 소프트웨어 차원에서 원격에 존재하는 두 호스트를 연결시켜 주는 매개체( 객체 )



   

  ↑ 서버는 자기 자신의 소켓과 여러 사용자와 통신하기위해 클라이언트별 소켓을 가지고 있어야한다.

    # 연결을 요청한 클라이언트에 대한 정보를 가진다.

    # 클라이언트는 서버와 통신할 소켓 1개만 있어도 통신이 가능

    # 소켓 통신 과정을 전화기로 비유 했을때

        1). 전화기를 준비한다.( socket )

        2). 전화국으로부터 전화번호를 부여 받는다.( bind )

        3). 전화를 기다린다.( listen )

        4). 전화를 받는다( accept )





  소켓의 구조



   - 소켓은 원격에 존재하는 두 호스트를 연결시켜주는 매개체 역활을 하기 때문에, 각 컴퓨터를 구분하기위한

     몇가지 정보가 들어있다.

   

   - 소켓은 Family, Type, Protocol 이라는 3가지 속성과, 서버와 클라이언트의 소켓에대한 주소 정보를 가진다.





Family


   - 어떤 유형의 프로토콜을 따라 소켓이 진행될 것인지를 지정해준다.



   AF_UNIX

   유닉스 기본 관리 체계 소켓 

   AF_INET

   IPv4의 인터넷 프로토콜

   AF_INET6   

   IPv6의 인터넷 프로토콜  




Type


   - 소켓의 통신 연결 방법에 대한 설정을 할 수 있다.


   SOCK_STREAM

  TCP, 스트림 소켓으로 연결지향형 방식 

   SOCK_DGRAM 

  UDP, 데이터그램 소켓으로 비연결형 방식 

   SOCK_RAW 

   RAW소켓, 저수중 프로토콜 제어 




소켓 종류



Stream_Socket

  - OSI 7계층 중 전송계층에 있는 TCP를 사용한 연결 지향형 프로토콜이다. TCP는 인터넷을 통해 다른 어플리케이션과 연결을 위해 

    한 쌍의 Stream 소켓을 사용한다. 데이터 전송은 원격지의 소켓과의 연결 후 이루어진다.( 전화- 상대방이 전화를 받지 않으면 통신 x)




Datagram_Socket

  - 전송계층에 있는 UDP를 사용한 비연결형 프로토콜이다. UDP는 TCP와 달리 원격지와의 연결에 신경을 쓰지 않고 메세지를 전송한다.

    인터넷을 통해 다른 응용프로그램에게 메세지를 보낵 위해 한쌍의 Datagram 소켓을 사용하는데, 연결과정 없이 바로 보내기 때문에

    도착지의 주소가 필요하다. ( 전화 -  상대방의 부재여부와 상관없이 메세지 전송 ) 그렇기 때문에 전송에 대한 신뢰성이 떨어진다.

    신뢰성을 유지하기위해서 타임아웃을 이용한 적절한 응답 확인( acknowledge)가 필요하다.



Raw_Socket

  - Stream_socket, Datagram_socket과 달리 TCP나 UDP같은 전송 계층을 사용하지 않고 IP인 네트워크 계층에 직접 접근한다. 그래서

    ICMP( Internet Control Message Protocol ) 또는 OSPF( Open Shortest Path First ) 같은 저수준의 프로토콜을 엑세스 할 수 있도록 해준다.

    root권한이 필요하고 새로운 프로토콜을 만드는데 주로 쓰인다.







  소켓 통신 하기


   - 소켓 통신에 사용한 환경은 리눅스( linuxt_centOS-5.1.1 )내 파이썬( Python3.6.0 ) 사용


 # 서버 소켓 


  - 클라이언트 별 소켓이 필요하다.

         >> 연결을 요청한 클라이언트에 대한 정보를 가진다.

  - 서버는 적어도 2개의 소켓이 필요하다.( 서버자신의 소켓, 클라이언트 소켓 )

 

  1). 소켓 생성  

  2). 포트 할당( 포트 오픈 -bind )

  3). 통신 대기 ( 연결을 기다린다. - listen )

  4). 통신 수락 ( 연결을 수락한다. - accept )

  5). 데이터 송/수신 ( 단방향- send/recv )

  6). 연결종료





 # 클라이언트 소켓 


  - 서버와 연결할 클라이언트 소켓 필요


  1). 소켓 생성

  2). 서버에 연결

  3). 데이터 송/수신 ( 단방향 - send/recv )



 # 간단한 소켓 통신 확인 ( tcp 통신 ) 


  ↑ 클라이언트측과 서버측을 구분하기위해 리눅스 터미널 2개를 띄워 pyhon3 동작

     # 각각 파이썬쉘에서 socket명령을 통해 클라이언트 소켓과 서버 소켓 생성

     # 소켓이름.socket( family, type ) 

    



  ↑ 포트를  ' 33333 ' 으로 할당( bind )하고, 통신 대기 상태( listen )로 해주었다.

    # 서버측 소켓.bind( ( ' ' , 생성 포트설정) ) → 생성할 포트를 설정한다.

    # 서버측 소켓.listen(1) → 통신 대기 상태 

    # netstat -ant명령어를 통해 현재 포트 상태를 볼 수 있다. 정상적으로 포트가 열리고, 통신 대기 상태 확인





  ↑ ① 서버측은 통신수락상태로 통신이 오길 기다린다. 

      ② 클라이언트 측은 서버측으로 통신을 연결한다. 

      ③ 정상적으로 통신이 되었음을 알 수 있다. 

         # host ip 는 현재 리눅스 ip



 ↑ 서버측에서 클라이언트로부터 통신을 수락함과 동시에 client1이라는 소켓을 만들었다.

    # 서버측에서 만들 client1소켓에 클라이언트측 정보가 들어있다.

    # info = 클라이언트 측, 아이피와 포트




 ↑ 서버에만든 client1 소켓으로 클라이언측과 간단한 통신을 할 수 있다.

    # send(), recv()를 이용해 메세지를 주고 받을 수 있다.

    # 서버는 클라이언트들과 통신할때 서버에 만든 각각의 클라이언트 소켓을 이용한다.



'Network' 카테고리의 다른 글

Network - LAN 과 WAN  (0) 2017.04.07
Network - 인터넷, 인트라넷, 엑스트라넷  (0) 2017.04.06
Network - Ipv4 패킷 구조  (0) 2017.03.30
Network - TCP 통신과 UDP통신  (3) 2017.03.29
네트워크 해킹 연습 사이트  (0) 2017.02.12