[JAVA WAS] Port 분석

Zoonmy·2024년 6월 24일

JAVA WAS

목록 보기
1/5

Vanila Java 를 사용한 WAS 서버 구축 프로젝트를 하면서, 소켓 통신에 대해 배우게 되었다.

이 프로젝트를 하면서, Day 가 질문한 점이 있어 정리해보았다

Day : 서버 포트는 8080으로 열었는데 왜 Port가 자꾸 이상하게 뜰까요?!

  • 첫번째 실행
    New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53877
    New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53878
    ...
  • 두번째 실행
    New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53893
    New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53894
    ...
  • Client가 접속한 포트는 8080이어야 하는데 왜 53877 ... 와 같은 포트번호가 뜨는 건가요?

부끄럽지만.. 데이의 학습을 위해 정리해본 자료를 적어본다..
https://profuse-aftershave-ac6.notion.site/Client-Port-8080-e2e1f2e3e1f240e4b159cacd975b3feb?pvs=4


💾 서버 Socket의 Port는 8080!

private static final int DEFAULT_PORT = 8080;

...

port = DEFAULT_PORT;  // PORT 번호를 8080으로 설정!

...

ServerSocket listenSocket = new ServerSocket(port); // Socket을 생성!

Untitled

  • log를 보면, 내가 설정해둔 port 값인 8080이 정상적으로 들어가서 수행된다!

⭐️ Socket..? HTTP..? Port..? 그게 뭔데요!!!

  • 사실 헷갈리는 것은 당연합니다!
  • 모두 다 네트워크 용어니까요~ 한 번에 이해하는 게 천재랍니다.
  • 그래도 이해를 돕기 위해 제가 차근차근 설명해볼게요~

1️⃣ HTTP 통신을 알아야 해요!

  • http 통신은 [ HTTP Protocol ] 이라고 불려요
  • Protocol..? 뭣…?!?! 그게먼데!!!
    • Protocol이란 말그대로 “약속” 이에요
    • 밑의 예시로 Protocol이라는 약속을 쉽게(?) 설명해볼게요
[ 대화 Protocol(약속) ]

1) 질문자가 인사를 한다.
2) 인사를 해야 한다.

라고 Protocol(약속)을 정의해볼게요!
[ ⭕️ 대화 약속이 지켜진 경우 ]: 데이~ 굿모닝입니다!
데이 :~ 굿모닝이에요~

[ ❌ 대화 약속이 지켜지지 않은 경우 ]: 데이 ~ 굿모닝입니다!
데이 : ... [아무 응답도 하지 않음]: ... [왜 데이가 대답을 안하지... 계속 기다림..]
  • 살짝쿵.. 감이 오시나요???
    • ⭕️ 대화 약속이 지켜진 경우에는 대화가 잘 이어지고 있어요
    • ❌ 대화 약속이 지켜지지 않은 경우에는 대화가 이어지지 않아요.. 저는 계속 데이의 대답을 기다리죠..

아래는 HTTP 통신 Protocol “약속” 이에요

Untitled

  • 왼쪽 : Client / 오른쪽 : Server

  • 아래처럼 약속을 정리할 수 있을 것 같아요!

[ HTTP 통신 약속]

1) Client(쭌마이)Server(데이)Request(인사)를 보낸다.
2) Server(데이)Client(쭌마이)에게 Response(인사)를 보낸다.

→ 그러면 Server가 Request를 보내고 싶을 때는요..??

Server(데이) : 나도 준마이(Client)한테 인사하고싶어... 

> http protocol은 Server -> Client 통신을 지원하지 않아요!
  • HTTP 통신은 Client가 보내야만 Server가 대답할 수 있어요ㅠㅠㅠ → 완전 별로!
    • 그러다 보니, 새로운 통신 수단이 필요하게 됐어요

2️⃣ http 통신의 단점을 보완하기 위해 소켓 통신이 나왔어요!

아래는 소켓 통신이에요!

Untitled

  • 소켓 통신이 나오면서, handshake 방식.. 등등이 나오지만 일단 넘어가요!

  • 이제는 서버와 클라이언트의 “양방향” 통신이 가능하게 되었어요!

  • 그림이 조금 어렵죠? 이해 안된다면 내리셔도 돼요! 위의 키워드만 기억하세요

소켓 통신을 통해 "양방향 통신" 이 가능하게 되었다!

✏️ 잠깐 정리!

  • 많이 헷갈리죠? ㅠㅠ

1) http 통신이란, 하나의 통신 “약속”이다.

2) http 통신의 client → server 간의 단방향 단점을 극복해야하는 통신이 필요했다

3) 단점을 보완한 것이 바로 “소켓 통신”이다!

로 정리할 수 있겠네요

사실 위의 내용도 설명하면 엄청 길지만 대충(?) 요약한 것이랍니다.. ㅠㅠ


Q) 자, 왜 소켓통신을 설명했을까요?

🔎 A) 그래야 port 번호를 이해할 수 있다!

  • 소켓 통신은 뭐라고 했었죠?
    • “양방향 통신”!

그러면 이번 WAS 프로젝트에서는 어떻게 동작할까요?

Untitled

ServerSocket을 생성 (Port 번호는 8080)

localhost:8080/ 에 접속할 때 마다 Client 소켓이 하나씩 생김!!

위의 경우에는 크게 4개의 소켓이 생길 수 있겠네요
  • 자 거의 다 왔씁니다!! ㅋㅋㅋㅋ ㅠㅠ

🔥 데이가 가장 궁금해하는 Client 소켓의 Port 번호는?!

🥹 : 서버 포트번호는 8080인거 알겠어.. 그러면 client 소켓 번호는 왜 무작위로 생성되는건데??ㅠㅠ

🤯 혹시.. 포트 번호가 무엇을 의미하는걸까요?

  • Port번호란, “프로세스”를 구분짓기 위한 16비트 크기의 할당이에요!
    • 말이 참 어렵죠..? 그러니까 넌 몇번째 프로세스야! 를 할당하기 위한 번호라고 이해하면 될 것 같아요!
    • 그러면 0번부터 2^16인 65,536까지 있을 수 있겠네요!

🥹 포트 번호가 뭔지는 알겠어요.. 왜 필요한 건데요 ㅠㅠ???

  • 예제를 한 번 볼까요?
📣 배달의 민족 주문!!

주문 1 : 102동으로 피자 한 판 가져다주세요

📣 배달의 민족 주문!!

주문 2 : 102동으로 파스타 하나 가져다주세요

...

가게 : 102"몇 호"로 가져다 달라는 거지?? 
			"몇 호"인지를 알아야 주문을 받지!!!!
  • 여기에서 “몇 호”는 뭘까요?
    • 바로 “포트 번호” 입니다!
  • 가게에서 피자랑 파스타를 102동 몇호에 가져다 줘야 할 지 알아야해요!
📣 배달의 민족 주문!!

주문 1 : 102402호로 피자 한 판 가져다주세요

📣 배달의 민족 주문!!

주문 2 : 102902호로 파스타 하나 가져다주세요

...

가게 : 102402호로 피자!

가게 : 102902호로 파스타!

이제 주문이 명확해졌어요!
  • 이제 포트 번호가 무엇을 의미하는 지 알겠나요? ㅎㅎ

✅ 각각의 Port 번호는 프로세스를 의미한다!

라고 정리할 수 있을까요? ㅎㅎㅎ

✅ 소켓 통신

✅ 포트 번호

2가지에 대해 우린 이미 알고있어요! 그러면 이제 마지막! 왜 client 포트 번호는 8080이 아닌거지?

→ 에 대한 답을 보러 가봅시다!!


두둥!!!!

Untitled

  • 포트는 16비트 크기의 프로세스의 할당 이라고 했죠?
    • 그래서 0번부터 2^16 (65535)까지 있답니다!
  • 카테고리를 살펴볼까요?
    • Well Known Ports
    • Registered Ports
    • Private Ports

→ 우리가 원하는 답은 Private Ports에 있습니다!!! 하지만, 다른 것들도 보고 가면 좋겠죠?

밑의 설명들을 보게 된다면,"클라이언트 포트 번호"1도 아니고 10도 아니고 100도 아니고 1000도 아니고

6xxxx, 5xxxx 단위인거야?? (6만 얼마, 5만 얼마)

에 대한 답을 할 수 있을 것입니다~!~!!

⭐️ 1) Well Known Port

  • Well Known Port를 알아야 합니다!

Well Know Ports란?

  • 말 그대로 “잘 알려진 포트” 라는 뜻이에요
  • 아래는 잘 알려진 포트들의 예시에요!
    • 그냥 쑤욱 훑어보고 넘어가세요 외울 수 없는 것들이라고 생각합니다 ㅎ…

Untitled

0~1023번 까지의 포트는 모두 각자의 역할이 정해져있어요

우리가 자주 쓰는 문자열을 

private final static String HELLO = "hello";

라고 쓰는 것처럼 통신에도 자주 쓰이는 친구들이 있겠죠??

그 친구들을 0번부터 1023번까지 할당해줌으로서

우리는 영국, 미국, 한국, 일본.. 등등 누구이든지간에 상관없이 

- 파일을 다운로드 받을때는 20번 포트! [ FTP ]

- 웹 페이지를 전송할때는 80번 포트! [ HTTP ]

...

이렇게 쓸 수 있는거에요!

하나의 약속인거죠 ㅎㅎ

⭐️ 2) Registered Port

  • 이 포트들은 “등록된 포트” 라고 하는 것들이에요
  • 등록된 포트들은 특정 용도로 사용되기 위해 등록된 포트번호들이에요
  • 외우진 않아도 되지만, 이 포트들 또한 “특정 동작”을 한다고 볼 수 있겠네요

Untitled

→ 어! 우리가 사용했던 8080 포트도 보이네요!

⭐️ 3) 대망의 private ports!

  • 앞에서 말했던 0번부터 1023번까지의 well-known ports
  • 1024번부터 49151번까지의 registered ports

들이 있었어요!!

그러면 49152부터 65535까지는 private ports가 되겠네요

Port 번호는 무엇이다? 프로세스를 구분하기 위한 할당이다!

저희가 노트북을 켜면 소켓 통신만 할까요?

- 크롬으로 lucas도 접속한다
- intellij로 코딩도 한다
- 유튜브 뮤직으로 음악도 듣는다
- slack으로 채팅도 한다
...

엄청나게 많은 것들이 이루어지고 있어요!

이러한 프로세스들을 우리는 49152번 부터 65535까지의 포트 번호들로 구분지어서 관리하고 있어요!

그러다 보니까 49152 ~ 65535 사이의 값들이 랜덤하게 지정이 되는 거에요

🔍 Client Socket Port 번호 분석!!

* 첫번째 실행
 
New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53877
New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53878
...
 
* 두번째 실행

New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53893
New Client Connect! Connected IP : /0:0:0:0:0:0:0:1, Port : 53894
 
 ...
  • 실행을 할 때 마다, 우리는 private ports들 중에서 할당되지 않은 번호를 찾아요!

  • 그래서 할당되지 않은 포트 번호들을 client socket의 port 번호로 붙여주는 것이랍니다~~


.. 미약한 설명.. 끝…

profile
열시미 해야쥐

0개의 댓글