티스토리 뷰

Network - TCP 통신, UDP 통신




  IP ( Internet Protocol )



  ↑ 가장 기본이 되는 기능만을 IP( 허리 기능 )에 포함시키고, 그 위에 TCP, UDP 라는 새로운 계층을 얹는 형태

     #  어떤 통신 관련 하드웨어 기술이든 IP만 구현하면 되고, 어떤 응용 프로그램이든 IP위에서만 동작하면 된다는 의미를 내포하는 그림

     # 유선 랜( Ethernet )과  WiFi 모두 IP주소를 쓰고, Bluetooth,LTE,3G 도 통신 할 때는 IP 주소를 부여 받아 통신한다.



 어떤 통신 방법이든 IP를 구현하는 한, IP위에서 동작하던 응용 프로그램을 지원하는 데 문제가 없으며, 어떤 응용프로그램이든IP로 통신한다는 것을 전제로 하면 IP를 지원하는 어떤 하드웨어 기술에서도 동작 할 수 있다고 한다.

 이로 인해 응용 프로그램과 하드웨어 기술은 독립적으로 발전할 수 있게 되었다. 이는 둘이 같이 바뀌면서 발전해야 하는 것보다 훨씬 더 빠른 기술적 진보를 이루게 해준다.



 각각 독립적으로 떨어져 있던 네트워크들을 서로 연결한 것이 인터넷이다. 그리고 이렇게 서로 독립적이던 네트

 워크들을 연결하기 위한 프로토콜이 '인터넷 프로토콜( Internet Protocol ) -> IP 이다.  그리고 IP가 이렇게 

 네트워크들을 연동하는 프토토콜이기 때문에 IP를 " 네트워크 수준 프로토콜 " 이라고도 한다.


 

 네트워크는 독립된 관리지가 존재하고, IP가 서로다른 네크워크를 연결한다. 각 네트워크가 독립적으로 동작한다는것은 여러 네트워크를 거쳐야 하는 IP 입장에서는 ' 반드시 통신 가능하다 ' 를 보장해줄 수 없다는 것을 뜻한다.

그래서 열심히 통신해보려고 하는데 반드시 된다는 보장은 못한다는 의미로, IP를 설명하는 중요한 특성으로

 best effort라는 표현을 사용한다.



 # 최선 노력 서비스( best effort )


     -  현행 인터넷은 Dummy network이라하여 망측은 단순 멍청하고 단말측이 지능적인 역활을 하는 구조

     -  따라서 망측에서 IP가 데이타그램의 전송을 위하여 노력을 하지만, 확실한 전송의 보장을 하지는 않는다.

     -  데이터의 흐름이 많거나 적거나 간에 시간지연이 없도록 하는등의 신뢰성을 보증하지 않는다.

     -  말그대로 최선의 노력을 하는 네트워크라는 의미, 우편배달로 예를 들곤한다.


  편지에 주소를 적어 보내면 우체부 아저씨가 수거해 가면 우체국에서 모아 보낼 주소지의 우체국으로 보낸 후 다시 그 곳 우체부 

  아저씨가주소지의 우편함에 편지를 가져다 놓게 된다. 근데 이 편지를 실제 사람에게 직접 전달해 주는 것이 아니고 또한 편지 

  받은 사람이 잘 받았 다고하는 것도 아니기 때문에 편지를 보낸 사람은 잘 도착했는지 전혀 알 수가 없다.

  이렇듯 우체국은 최선의 노력을 다해 목적지 주소로 편지를 보내지만 편지가 실제 사람에게 전달되었는 지에 대해서 보증하지는 

  않는다. 이런식의 네트워크를 best effort network라고 하며 우리가 사용하는 인터넷이다.

   



  TCP ( Transmission Control Protocol )


   - 프로토콜 통신이 안정성과 신뢰성을 보장해주지 못한다면 그걸 이용한 통신을을 한다는것은 힘든일이다.

     이러한  안정적인 통신을 가능하게 해주는것이 바로 TCP이다.

     TCP는 Transmission Control Protocol의 약자로 ' 전송 제어 프로토콜 ' 정도로 생각하면 된다. 

     안정적으로 패킷이 가지 못하는 경우 이걸 캐치해서 안정적으로 갈 수 있게 전송을 제어하는 역활을 하는 

     프로토콜이라는 뜻이다.




  ↑ TCP통신과정



 TCP는 ACK와 타임아웃, 재전송으로 안정성을 보장 받는다. ACK는 받은 걸 받았다고 알려주는 것을 의미한다.

 Acknowledge의 약자인 ACK는 " 잘 받았다 " 라고 생각하면 된다. TCP 데이터가 물줄기 처럼 흐른다고 해서

 Stream 이라는 표현을 쓰는데, 이를 통틀어서 패킷이라고 하자, TCP는 패킷을 받을 떄마다 ACK 라는 별도의 

 패킷을 만들어서 " 잘 받았습니다. 제가 다음에 받아야 하는 것은 x번 패킷 입니다. " 이걸 이용해서 데이터가

 잘 가고 있는지를 판단한다.


 또한 패킷을 받은 쪽은 ACK을 보내서 패킷을 보내는 쪽에게 잘 받고 있다는 것을 알려주는데, ACK가 일정 시간

 동안 오지 않으면 패킷을 보내는 쪽에서는 특단의 조치를 취한다. 바로 다시 보내기( 재전송 )이다.



 ACK가 오지 않는 경우는 2가지로 생각해 볼 수 있다. 보낸 패킷이 받는 쪽에 도착을 못해서 받는 쪽이 ACK을 

 보내야 하는것을 아예 모르는 경우와 받는 쪽은 패킷을 받았고 ACK도 보냈는데 ACK가 불안정한 IP 때문에 

 중간에 유실된 경우 이다. 어떠한 경우이든 일정 시간 동안 ACK을 못 받으면 패킷을 다시 보내버린다. 비효율

 적일 수 있어도 상당히 확실한 방법이기 때문이다.



  ↑ TCP는 ACK라는 특별한 패킷을 이용해서 받는 쪽에 패킷이 잘 도착했다는 것을 알려준다.

    # 데이터가 유실되거나, ACK가 유실되거나 어떤 경우이든 client쪽은 어떤 일이 발생했는지 알 수 없다. 

       그래서 보내는쪽은 일정 시간이 지나는 동안 ACK가 도착하지 않으면 바로 재전송한다.




  TCP  - 요약


   - TCP는 신뢰할 수 있는 프로토콜이다.

   - 두 머신에서 데이터를 주고 받을 때 파일에 쓰는 것처럼 한 쪽에서 쓰고 다른 쪽에서 읽을 수 있다.

   - 연결은 신뢰할 수 있고 순차적이다.

   - TCP 통신은 쉽게 전화 통화 하는 방식으로 동작한다. 상대방의 전화번호를 알고 있어야 전화를 걸 수 있듯,

     상대방의 IP주소와 포트를 알고 있어야 연결할 수 있다.

   - 서버가 응답을 받아주지 않으면 계속적으로 요청을하게 된다. 어느 시점에서 요청을 포기하게 될 수 도있다.

   - 이처럼 TCP 통신은 계속적으로 소켓을 통해 데이터를 주고 받을 수 있는 양방향 통신이 가능하다.

      또한 데이터를 받지 못했을 때 다시 요청하는 메커니즘이 있다.







  UDP ( User Datagram Protocol )


   - UDP는 IP를 사용하는 네트워크 내에서 컴퓨터 간에 메시지들이 교환될 때 제한된 서비스만을 제공하는

     통신 프로토콜이다. UDP는 TCP의 대안이며, IP와 함께 쓰일 때에에는 UDP/IP라고 표현하기도 한다.

     


 TCP와 마찬가지로 UDP도 한 컴퓨터에서 다른 컴퓨터로 데이터그램이라고 불리는 실제 데이터 단위를 받기위해

 IP를 사용한다. 그러나 UDP는 TCP와 달리, 메시지를 패킷으로 나누고, 반대편에서 재조립하는 등의 서비스를 

 제공하지 않는다. 즉, 여러 컴퓨터를 커티지 않고 데이터를 주고 받을 컴퓨터 끼리 직접 연결하고자 할때 UDP를

 사용한다. 


 UDP를 사용해서 목적지( IP: x.x.x.x , port:yyyy )로 메세지를 보낼 수 있고, 컴퓨터를 거쳐서 목적지 까지 도달할 수 

 있고, 도착하지 않을 수도 있다. 받는 곳에서 포트( yyyy )를 열어두고 패킷이 올때 까지 기다린다.

 이 때 어떤 컴퓨터에서 온 것이든 모두 받아들인다. 받는 쪽에서는 패킷이 도착했을 때 출발지에 대한 정보( IP, Port )

 를 알 수 있다. 그리고 패킷 데이터를 읽을 수 있다. 



 UDP는 이러한 특성 때문에 안정적이지 않은 프로토콜이다. 일반적으로 1~5% 정도의 데이터를 잃는 경우가 많고,

 데이터를 전혀 받지 못할 수 도 있다. 또한 패킷이 전송되는 순서가 보장되지 않는다.



 보통 사람들이 " 속도 떄문에 UDP를 쓴다." 라고 하는데, 이는 UDP가 최적의 경로를 따라 간다는 뜻이 아니라

 TCP에 비해서 하는일도 없고, 주변 신경도 안쓰기 때문에 상대적으로 떠 빠르다는 뜻이다.( TCP에 비해서 )

 TCP와 달리 안정성 확보를를 위해서 해야되는 일도 없고, 네트워크 체증 생각도 안하고 마구잡이로 보낼 수 있다.





  UDP - 요약




    - UDP는 신뢰할 수 없 프로토콜이다.

    - 상대방과 연결되어 있는 개념이 아니다. 소켓을 개설하고 그냥 데이터를 보내는 개념

    - 안정적이지 않고 순서도 보장되지 않ㅎ는다. 데이터를 잃을 수도, 중복될 수도 있다.

    - 편지를 보내는 방식과 유사하다. 편지를 보냈더라도 편지를 받는 사람은 편지함을 열어보기 전에는

      편지가 제대로 왔는지 알 수 없다.


    - UDP통신은 UDP소켓을 통해서 자신의 포트를 확인하기 전까지 데이터가 왔는지 알 수 없다.









  TCP ,UDP통신 실습


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

   - 소켓 통신과 동일하게 클라이언트측, 서버측으로 쉘을 나누어 통신

   - 클라이언트 파일과, 서버파일을 각각 만들어 통신을 시도






 # TCP 통신 ( Server ) 




 ↑vi를 통해 tcp 통신을 위한 server 생성

   # 포트번호는 임의로 설정할 수 있다.


   


 ↑python3 [ 파이썬 파일 ] : 생성한 tcp 서버를 열어 두었다.

   # 프롬프트가 나오지 않음은, ' 아직 동작이 끝났다 ' 를 의미한다.

   # 통신에대한 연결을 기다리는 상태이다.



 ↑tcp_server 에서 설정한 33333번 포트가 정상적으로 열리고, listen 상태가 되어있다.




 # TCP 통신 ( Client ) 



 ↑클라이언트측 파일 생성 ( tcp_client )

   # 연결을 원하는 ip는 자신의 현재 리눅스 ip : 컴퓨터 한대로 통신을하기 때문

   # 서버와 달리 변수 HOST에 연결을 원하는 Ip를 적어야한다. ( 클라이언트가 서버로 연결을 시도하기 때문이다. )






 # TCP 통신 ( 연결 ) 



 ↑python3 tcp_server.py 로 서버를 통신 대기 상태로 만들고 대기한다.

    # 다른 쉘로 접속해 python3 tcp_client.py 명령을 해주면, 정상적으로 통신이 이루어진다.

    # 성공적으로 통신이된다면 서버측의 프롬프트가 대기상태에서 데이터를 받는다.

  








 # UDP 통신 ( Server ) 



 ↑vi를 통해 udp 통신을 위한 server 생성

    # 포트번호는 임의로 설정할 수있다.

    # tcp 통신보다 간단하게 통신을 할 수 있다.

    # udp 통신은 tcp 통신과 다르게 소켓의 타입이 Datagram방식이다.( TCP는 Stream)




 # UDP 통신 ( Clinet ) 




 ↑vi를 통해 udp 통신을 위한 Clinet 생성

  





 # UDP 통신 ( 연결 ) 



 ↑tcp 통신과 마찬가지로 ,  pyhon3 udp_server.py로 통신 대기상태에서 python3 udp_client.py를 통해 통신을 수행한다.



참고 ===================================

http://www.inven.co.kr/webzine/news/?news=165870

'Network' 카테고리의 다른 글

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