Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[suffle] Chapter1. 서버란 무엇인가(소켓&멀티 프로세스) #2

Merged
merged 1 commit into from
Apr 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
152 changes: 152 additions & 0 deletions docs/chapter1/Ch01. About Server (Socket & Multi-process).md
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@

# 1. 서버란 무엇인가

- **정의**
- OS에 의해 동작하는 프로세스이며 클라이언트의 역할을 하는 프로세스와 ==소켓==을 통해 **IPC**를 수행하는 것이다.
- **보일러 플레이팅**
- [[OS] 시스템 콜, System Call](https://velog.io/@nnnyeong/OS-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%BD%9C-System-Call)
- [[운영체제] 프로세스와 스레드](https://velog.io/@aeong98/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C)
- [OSI 7계층과 TCP/IP 4계층 모델 :: 성실함 (tistory.com)](https://ariz1623.tistory.com/327)
- [TCP 와 UDP 차이를 자세히 알아보자 (velog.io)](https://velog.io/@hidaehyunlee/TCP-%EC%99%80-UDP-%EC%9D%98-%EC%B0%A8%EC%9D%B4)
- **네트워크 통신**
- 컴퓨터가 직접 네트워크에서 통신을 하는 것이 아니고, 컴퓨터에서 동작하는 프로세스가 또 다른 컴퓨터의 프로세스와 통신을 하는 것이다.
- ex) 인터넷을 사용할 때 웹 브라우저(하나의 프로세스)가 웹 서버(다른 컴퓨터에서 실행되는 프로세스)와 통신하여 웹 페이지를 불러온다.


# 2. Ip주소와 데이터 송수신

### OSI 7계층과 TCP/IP 계층

- OSI 7게층

- TCP/IP 계층

### IP 주소와 포트 번호

컴퓨터가 네트워크 상에서 통신을 하기 위해서는 수많은 정보의 바다에서 자신이 누구인지 유일하게 ==**식별이 가능한 수단**==이 있어야 한다.

- 전세계에 IP 오지게 많은데 부족하지 않음?
- 해결 방법 : NAT, 서브네팅, IPv6

IP 주소를 통해 컴퓨터를 식별 했다면, 해당 컴퓨터에서 어떤 프로세스에게 데이터를 보내야 하는지 알아야 되는데, 이 때 사용되는 식별 값이 포트 번호이다.

>(서버 프로세스 B가 동작 중인 컴퓨터의 아이피 주소):(서버 프로세스가 부여받은 포트번호)
>즉, [203.230.7.2:80]의 뜻은 [203.230.7.2의 아이피 주소를 가진 컴퓨터의 80번 포트의 프로세스] 를 말합니다.

**포트 번호(좀 더)**
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

임의로 포트번호를 부여하는 것과 HTTP는 80, HTTPS는 443으로 고정되어 있는 것의 의미를 자세하게 잘 작성해주셔서 이해가 쉬웠습니다!

- 네트워크 상에서 통신을 수행하는 **프로세스를 구분**하는데 사용된다.
- 여러 브라우저 탭을 열어 서로 다른 웹 사이트에 접속하는 경우, 각 탭은 내부적으로 다른 포트 번호를 사용하여 웹 서버의 프로세스와 독립적으로 통신할 수 있다.
- 표준화된 포트 번호는 특정 서비스를 위해 예약되어 있다. 예를 들어서 HTTP 통신은 포트 80을 사용하고 HTTPS는 포트 443을 사용한다.
- **표준화된 포트 번호?**
- 네트워크 상의 특정 서비스 유형에 대한 전세계적인 약속이다.
- ex) 웹 서버 소프트웨어는 HTTP 통신을 위해 80번 포트를 사용하고, 이는 인터넷 상의 모든 웹 서버와 클라이언트 사이의 공통적인 이해이다.
- **송신 포트와 수신 포트**
- **송신 포트**
- 데이터를 보내는 측(클라이언트)에서 사용하는 포트 번호이다.
- 동적으로 할당이 된다. (os에 의해서 자동으로 선택이된다.)
- **수신 포트**
- 서버에서 사용하는 포트 번호 이다. 서버가 클라이언트로부터의 요청을 받기 위해 listening 상태로 대기하고 있는 포트로, "목적지" 포트이다.

![[Pasted image 20240401211616.png]]
<유튜브에 접속할 때>

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전공 수업을 들으면서 항상 의문이 들었던 부분인데 자세하게 설명해주셔서 이해가 잘 됐습니다. 감사해요 :)

- **수신 포트(서버 측 포트, Destination Port):** HTTPS 통신을 위해 `443` 포트에서 리스닝 상태이다.
- **송신 포트(클라이언트 측 포트, Source Port) :** 크롬브라우저는 유트브 서버에 데이터를 요청할 때 임의의 포트 번호를 송신 포트로 사용할 수 있다. 이 포트는 서버로 데이터를 보내고 서버의 응답을 받기 위해 사용된다.

> 통신은 내 컴퓨터(송신포트 = 랜덤)로부터 웹 서버(수신 포트=443)로 진행된다.
> 그리고 웹 서버(수신 포트=443)로부터 내 컴퓨터(송신 포트=xxxx)로 서버의 응답이 전송된다.

TCP 헤더에 송신, 수신 포트 번호가 들어있다.
당연히 웹 페이지 창이 여러 개이면 송신 포트는 각 창마다 다르다. (프로세스 구분해야)

>[!정리]
>표준화된 포트 번호는 수신 포트 번호의 용도로 주로 사용되고 송신 포트 번호는 클라이언트 측에서 프로세스 구분을 위해 사용된다.

# 3. 소켓

### 데이터 송신 할 때
1. 서버 프로세스가 운영체제의 write 시스템 콜을 통해 소켓에 데이터를 보내게 되고
2. TCP/UDP 계층과 IP 계층 그리고 대표적으로 Ethernet을 거쳐 흐름제어, 라우팅 등의 작업
3. NIC(랜카드)를 통해 외부로 데이터를 보낸다.
### 데이터를 수신 할 때
1. NIC 에서 데이터를 수신
2. 인터럽트를 통해 Driver로 데이터를 옮긴다.
3. 네트워크 스택에서 데이터가 이동하며 소켓에 데이터가 담긴다.
4. 최종적으로 수신 대상이 되는 프로세스에 데이터가 도달하게 된다.

종류
- TCP (Stream 소켓)
- 신뢰성 있는 데이터 송수신
- 3-way handshake Process
- UDP (datagram 소켓)
- 비연결 지향

![[Pasted image 20240402195334.png]]
- client가 보내는 SYN이 listen 상태인 서버의 소켓에 연결 요청을 보내는 것이다. (Connect())
- 이후 과정은 accept 시스템 콜 이후 진행하여 최종적으로 Established 상태를 수립하고 본격적인 데이터 송/수신이 이루어진다.
- 멀티 프로세스/멀티 쓰레드
- 서버(하나의 프로세스) : Backlog queue에 있는 클라이언트의 요청을 하나씩 받아서 처리해주면 너무 오래걸림(병목현상)
- **연결 요청을 받는 부분을 따로, 응답까지 해주는 부분을 따로**



![[Pasted image 20240402145438.png]]
네프에서 많이 봤던 친구...!

##### 아무래도 서버가 많이 바쁘다
- Client와 다르게 bind(), listen(), accept()를 한다.

### 파이썬으로 해보기

```python
import argparse
import socket

def server(interface, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((interface, port))
sock.listen(1)
print("Server is running and listening at ", sock.getsockname())

while True:
client_sock , addr = sock.accept()
print("Accepted connection from", addr)
data = client_sock.recv(1024)
if not data:
break
print(">> Recived data " + data.decode())
response = "recieved well " + str(addr)
client_sock.sendall(response.encode())
client_sock.close()

def client(hostname, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((hostname, port))
print("Client connected to {}:{}".format(hostname, port))
msg = input("Enter a message to send to the server: ")
sock.send(msg.encode())
response = sock.recv(1024)
print("received:", response.decode())
sock.close


if __name__ == "__main__":
choices = {"client": client, "server": server}
parser = argparse.ArgumentParser(description="Send and receive TCP packets, ensuring data reliability and order")
parser.add_argument("role", choices=choices, help="which role to play")
parser.add_argument("host", help="interface the server listens at; host the client sends to")
parser.add_argument("-p", metavar="PORT", type=int, default=1060, help="TCP port (default 1060)")
args = parser.parse_args()
function = choices[args.role]
function(args.host, args.p)

```

**실행 화면**
![[Pasted image 20240402204751.png]]

함수 설명
- accept( )
- 서버가 클라이언트의 연결 요청을 수락(accept)
- 반환 값
- 새로운 소켓 객체 : 서버와 특정 클라이언트 간의 통신에 사용된다. 기존의 리스닝 소켓은 여전히 다른 클라이언트로부터 요청을 수신 대기하는 데 사용된다.
- 클라이언트 주소 정보 : 클라이언트 주소를 나타내는 튜플이며 일반적으로 (IP 주소, 포트 번호)의 형태를 가진다.
Binary file added docs/chapter1/img/Pasted image 20240401211616.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/chapter1/img/Pasted image 20240402195334.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/chapter1/img/Pasted image 20240402204751.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.