본문 바로가기
Web/Network

Java TCP/IP 통신 (1)

by 미티치 2016. 10. 7.

Java를 공부하면서 한번씩 보게되는 채팅 프로그램. 처음 그리고 두번째 공부할 때까진 별 생각 없었는데 한 세번정도 다시 본 지금. 소켓, TCP/IP, 포트, 쓰레드 등 이런 용어도 생소했던 제일 처음, 자바로 멀티 채팅 프로그램을 공부했을 때 그 때 궁금해하던 것들을 정리해야겠다는 생각이 들었습니다. 그 땐 책을봐도 이해가 안갔던 부분들이 많았는데 지금은 '책을 보면 이해간다' 정도이지 뭐 엄청 쉽게 풀어서 설명하고 소스를 안보고 짤만큼 잘해서 내부적인 부분까지 완벽하게 아는 것도 아니라서 크게 별다른건 없겠지만, 그래도 궁금해하던 것들에 대해 한번 정리는 해야겠으니까!


정리 내용에 순서는 없지만, 전체적인 그림을 그리고 그 그림을 프로그램으로 짜는 순서로 정리할 계획입니다.






먼저, 컴퓨터와 컴퓨터가 어떻게 통신하는가? 



TCP/IP 통신, 소켓 프로그래밍 이런 것들은 많이 들어봤을겁니다. 하지만 저는 정확하게 소켓이 무엇인지, TCP/IP 프로토콜이 무엇인지에 대해 잘 몰랐습니다. ( 지금도 완벽하게 알고있다고 할 순 없지만 ㅜㅜ ) 그래서 컴퓨터와 컴퓨터가 어떻게 통신을 하는지, 인터넷을 통해 원격에 있는 친구와 어떻게 대화를 주고 받는지 몰랐습니다. 사실 제목이 거창하지 그냥 정말 쌩초보자 입장에서 간략한 그림을 그리는 정도의 설명이기 때문에 구체적으로 패킷이 OSI 7계층에서 어떻게 전송되는지 이런 내용까지는 정리하지 않겠습니다.

위의 그림은 이런 통신이 어떻게 이루어지는지 보여주는 그림입니다. 


위처럼 원격으로 존재하는 컴퓨터 두 대가 있을 때, 이 컴퓨터 두 대가 통신하는 방법은 여러가지가 있을 것입니다. 여러가지 방법이 있겠지만 웹 서버를 통해 통신 하거나 또는 (웹 서버가 아닌) 서버-클라이언트 형식으로 구성되어 통신할 수도 있을 것입니다. 이렇게 원격지에 존재하는 호스트(컴퓨터)들 간에 데이터를 주고 받을 수 있도록 프로그램을 구현하는 것을 네트워크 프로그래밍이라고 합니다. 





서로 통신하고자 하는 대상이 (바로 옆에 있는 컴퓨터라서 유선으로 연결하여 통신하는 경우를 제외하고) 원격에 있기 때문에 소프트웨어 차원에서 연결하기 위해서는 유선으로 연결하는 것처럼 느끼게 해주는 장치가 필요하겠죠? 

바로 이 연결 장치가 1) 소켓(socket)이 될 것입니다. 

( 소켓이 내부적으로 어떤 장치인지 알기 위해서는 C언어로 소켓 프로그래밍을 해봐야하지 않을까요ㅠㅠ 내부적인 부분까진 정확하게 알 수 없으나 개념적인 부분만 언급하자면 !! )


 소켓은 서울에 있는 내 컴퓨터에 깔린 채팅 프로그램에서 부산에 있는 친구의 컴퓨터에 깔린 채팅 프로그램으로 메세지를 보내기 위해 내 컴퓨터와 친구의 컴퓨터에 끼우는 거라고 생각하시면 될 것 같습니다. 이 소켓에는 메세지가 도달할 주소와 포트 번호가 들어있는데, 위의 그림처럼 컴퓨터에 소켓을 끼워서 ( 프로그램에서는 소켓을 생성하면~ 이라고 표현하겠죠? ) 통신할 컴퓨터의 IP 주소와 포트 번호를 넣어주면 두 컴퓨터는 보이지 않는 통신 망이 생긴거라고 보시면 됩니다. 


* 물론 TCP/IP 프로토콜이 3-way handShake 개념이라던가 실제로 라우터를 거쳐 어떻게 패킷이 전송되는지에 대해 언급하자면 보이지 않는 통신망이 생겼다는 표현은 정확한 표현은 아니지만, 일단 넘어가는걸로! 


따라서 소켓이란 단말간에 통신을 하고자 할 때 정보를 주고받기 위해 연결된 통신 통로의 각 끝부분인 통신 접속점, 즉 창구라고 생각하면 될 것 같습니다. 



이제 서버와 클라이언트가 소켓을 사용해서 통신할 준비를 하는 과정에서, 

2) 원격지에 있는 Client 가 Server의 위치를 어떻게 알고 가는가? 이 부분에 대해 설명하겠습니다. 간략하게 설명하자면 클라이언트는 Server의 IP주소와 이 Server와 Client를 연결시킬 포트번호를 이용해서 찾아갑니다. 예를들어 IP주소는 집주소와 같습니다. 세상에서 하나밖에 없는 주소로, Client가 전 세계에 연결되어있는 네트워크에서 내가 원하는 서버를 찾기 위해서는 이 IP 주소를 이용해서 찾을 수 있습니다. 



근데 여기서 3) 포트번호는 왜 필요할까? 

우리가 그럼 Naver의 서버 IP주소만 알면 서버에 바로 접근할 수 있느냐? 아닙니다. 서버는 허용된 클라이언트가 서버에 접근할 수 있도록 수 많은 통로를 갖고있습니다. 이 통로들이 바로 포트(PORT)입니다. 서버가 가진 수많은 포트 중 '나는 7777, 7778 포트를 열어놓을거야' 라고 지정해서 열어놓은 포트로만 클라이언트가 접근할 수 있습니다. 따라서 클라이언트에서 서버로 접근하기 위해서는 IP주소 뿐만아니라 서버와 약속되어 서버가 열어놓은 포트번호를 알아야만 서버와 연결을 하여 통신을 할 수 있습니다. 그렇다면 내가 만든 서버에서 포트 번호를 랜덤으로 아무거나 지정해서 사용할 수 있느냐? 라고 묻는다면 답은 'NO' 입니다. 포트 번호는 크게 세 종류로 구분이 되는데 다음과 같습니다.




0 ~ 1023번 : 잘 알려진 포트 (Well-Known Port)

     - 대표적으로 텔넷(23), DNS(53), HTTP(80), NNTP(119), TLS/SSL 방식의 HTTP(443)


1024 ~ 49151번 : 등록된 포트 (Registered Port)


49152 ~ 65535번 : 동적 포트 (Dynamic Port)




통신에서 가장 많이 쓰이는 TPC/IP 프로토콜을 사용하는 응용프로그램들은 통신을 할 경우 IANA에서 지정한 포트를 사용하는데, 이 포트번호들이 잘 알려진 포트로, 잘 알려진 포트번호는 열기 위해서는 루트권한이 있어야합니다.

 

1024~49151는 중복방지를 위해서 IANA에 등록은 되어있으나 IANA의 통제를 받지 않기 때문에 우리가 임의로 서버를 구축해서 TCP 통신을 하고자 할때 이 범위 안에서 포트번호를 사용하면 됩니다. 동적포트 IANA에 등록도 되어있지 않고 통제도 받지 않는 포트로, 어떠한 프로세스에 의해서도 사용이 가능하며 임시 포트번호라고도 합니다.





그렇다면 이제 TCP/IP 프로토콜에서 Client가 Server를 IP주소를 이용해서 어떻게 찾는지 알게되었습니다. 그리고 위에서 설명했듯이 통신을 하기 위해서 '소켓'을 이용합니다. 다시 정리하자면 통신을 하려면 서버든 클라이언트든 소켓을 만들어주고 그 소켓을 이용해서 통신을 하게됩니다. 소켓을 이용해서 서버와 클라이언트 사이의 흐름(Stream)을 받아 정보를 주고받으면 통신이 되는 겁니다.



- 통신 네트워크란 단말 사용자들끼리 통신을 가능하게 할 목적으로 연결해 놓은 단말, 링크, 노드의 집합이다.

인터넷은 컴퓨터로 연결하며 TCP/IP라는 통신 프로토콜을 이용해 정보를 주고받는 컴퓨터 네트워크이다.

- 일반적으로 소켓 프로그래밍과 네트워크 프로그래밍은 같은 의미로 사용되는 용어입니다. 




'Web > Network' 카테고리의 다른 글

Java TCP/IP 통신 (2)  (0) 2016.10.07