CS & 알고리즘 스터디: 일곱 번째 스터디
일곱 번째 스터디
본래 지난 주에 진행했어야 할 내용이나, 스터디원들의 스케줄 이슈로 한 주 건너뛰고 이번 주에 진행하게 되었다. 아마 1~2주 이내로 스터디 분량이 마무리 될 것 같아서 그래도 기존에 목표로 했던 8월 이내에 마무리 지을 수 있을 것 같다.
키워드
웹소켓과 소켓 통신
Q: 소켓과 포트의 차이가 무엇인가요?
A:
소켓은 네트워크 통신의 끝점(Endpoint)를 나타내는 추상화된 개념으로, 프로세스 간 통신을 가능하게 한다. 포트는 네트워크 통신에서 특정 프로세스를 식별하기 위해 사용되는 숫자로, IP 주소와 결합되어 네트워크 상에서 데이터를 올바른 애플리케이션으로 전달하는 역할을 하는 일종의 주소이다.
차이점을 살펴보자면, 소켓은 데이터를 실제로 주고 받기 위해 사용되는 ‘길’이라고 볼 수 있고, 포트는 어디로 해당 데이터를 보내야 하는지 식별해주는 ‘주소’로 볼 수 있다.
Q: 여러 소켓이 있다고 할 때, 이 소켓들의 포트 번호는 모두 다른가요?
A:
모두 다를 수도 있지만 포트 번호가 같은 소켓이 존재할 수도 있다. 포트 번호는 하나의 호스트 내에서 고유하지만, 하나의 프로세스는 여러 개의 소켓을 열 수 있기 때문에 같은 번호의 포트가 별도 프로세스 내에서 존재할 수 있다.
TCP/UDP 프로토콜
Q: TCP와 UDP의 차이에 대해 설명해주세요.
A:
TCP와 UDP는 OSI 7계층 중 4계층인 Transport Layer에 속하는 통신 프로토콜로, TCP는 연결지향 프로토콜이며 UDP는 비연결지향 프로토콜이다.
TCP는 연결지향적인 면으로 인해 3-Way-Handshake 과정을 거쳐야 연결이 설정되며, 이렇게 연결이 설정되어야 통신을 시작하기 때문에 흐름 제어를 지원하고 가상 회선 방식을 이용해 데이터의 순서와 신뢰를 보장한다. 반면 UDP는 이러한 연결 과정이 없으며 보내는 쪽에서 데이터그램 방식을 이용해 일방적으로 전달한다. 이는 데이터 순서에 대한 신뢰를 보장하지는 않지만 전송 속도가 빠르다는 장점이 있다.
데이터그램 방식:
네트워크 통신에서 사용되는 기본 데이터 전송 단위로, 간단한 헤더 구조를 가짐으로 빠르게 전송된다.
Q: Checksum이 무엇인가요?
A:
Checksum은 전송된 데이터에 대해 오류가 있는지 확인하는 중복 검사의 한 형태로, 자료의 무결성을 보장하는 방법이다.
말 그대로 체크해서 더한다는 의미로, 모든 데이터의 값을 더한 다음에 1의 보수를 취한 값이 바로 체크섬 값이다. 이렇게 얻은 체크섬 값과 데이터에 or연산을 하면 전부 1로만 이루어진 값이 나오는데, 여기에 0이 존재한다면 송신된 데이터에 오류가 있다고 판단하는 방식이다.
Q: TCP와 UDP중 어느 프로토콜이 Checksum을 수행할까요?
A:
TCP에서는 필수적으로 Checksum을 수행하며, UDP는 선택적으로 적용 가능하다.
Q: TCP가 신뢰성을 보장하는 방법에 대해 설명해주세요.
A:
TCP는 신뢰성을 보장하기 위해 순차적으로 데이터를 확인한다. 첫 번째 데이터에 대해 확인이 되면 그 다음 데이터를 보내는 방식을 사용하는데, 이 데이터 패킷들은 넘버링 된 세그먼트라는 단위로 송신되기 때문에 순서를 보장할 수 있다. Checksum 등의 오류 검사를 수행한 후, 데이터 손상 유무에 따라 응답을 다르게 하여 손상된 데이터는 재전송될 수 있도록 조치한다.
Q: 왜 HTTP는 TCP를 사용하나요?
A:
HTTP의 특성과 요구사항이 TCP의 특징과 잘 맞기 떄문에 TCP가 사용된다.
TCP는 오류 검출, 재전송, 순서 제어 등의 메커니즘을 제공하기 때문에 데이터의 신뢰성 있는 전송을 보장하며, 연결 지향적이기 때문에 안정적이고 지속적인 연결을 유지하기에 용이하다. 또한, 혼잡 제어 메커니즘으로 네트워크 상태롤 모니터링하여 전송 속도를 상황에 맞게 조절한다.
Q: 브라우저는 어떤 서버가 TCP를 쓰는지, UDP를 쓰는지 어떻게 알 수 있나요?
A:
브라우저는 일반적으로 URL을 확인하여 어떠한 프로토콜이 사용되는지 확인할 수 있다. http와 https, ftp, ws등 웹에서 사용되는 프로토콜은 모두 TCP를 사용한다.
DHCP
Q: DHCP가 무엇인지 설명해주세요.
A:
DHCP란 Dynamic Host Configuration Protocol의 약자로, 네트워크에서 IP 주소 및 관련 정보를 자동으로 할당하고 관리하는 프로토콜이다.
일반적으로 사용자가 인터넷을 사용하기 위해서는 본인의 IP주소, 서브넷 마스크 등의 네트워크 환경을 설정해야 하는데, DHCP를 사용하면 클라이언트 장치가 네트워크에 연결될 때 IP 주소 및 기타 네트워크 구성 요소를 자동으로 얻을 수 있으며 이는 네트워크 관리의 부담을 줄여준다.
Q: DHCP는 몇 계층 프로토콜인가요?
A:
DHCP는 OSI 7계층에서 애플리케이션 계층, 즉 최상위 계층에 속하는 프로토콜이다. 즉, 자체적으로는 앞서 말한 네트워크 설정을 자동으로 관리하고 할당하는 기능을 제공하며, 데이터 전송은 하위 계층의 프로토콜을 사용하여 이루어진다.
Q: DHCP에서 UDP를 사용하는 이유가 무엇인가요?
A:
DHCP의 요구 사항이 UDP의 특성과 잘 맞기 때문이다. DHCP의 역할인 동적 네트워크 환경설정은 TCP와 같은 신뢰도 높은 연결보다는 UDP와 같은 빠른 연결이 중요하며, DHCP 자체로 IP를 할당받기 전에는 신뢰성 있는 연결이 불가능 한 이유 또한 UDP를 사용하는 이유 중 하나이다.
Q: DHCP의 유효기간은 얼마나 긴가요?
A:
DHCP는 IP주소를 임대해주는 개념으로, 일정 시간이 지나면 다시 바꿔주어야 한다. 일반적으로 DHCP 서버는 이 유효기간을 8시간을 설정하지만, 유동인구가 많은 장소에서는 이를 다르게 설정하여 IP주소가 부족해지는 경우를 방지할 수 있다.
문제 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import stdin
input = sys.stdin.readline
N = int(input())
arr = list(map(int, input().split()))
max_table = arr
min_table = arr
for _ in range(N - 1):
arr = list(map(int, input().split()))
max_table = [arr[0] + max(max_table[0], max_table[1]), arr[1] + max(max_table), arr[2] + max(max_table[1], max_table[2])]
min_table = [arr[0] + min(min_table[0], min_table[1]), arr[1] + min(min_table), arr[2] + min(min_table[1], min_table[2])]
print(max(max_table), min(min_table))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import sys
input = sys.stdin.readline
N, M, L = map(int, input().split())
def find_location(rest, dist, M):
count = 0
for i in range(1, len(rest)):
count += (rest[i] - rest[i - 1] - 1) // dist
return count <= M
def binary_search():
lt = 1
rt = L
while lt < rt:
mid = (lt + rt)//2
if find_location(rest, mid, M):
rt = mid
else:
lt = mid + 1
return lt
rest = list(map(int, input().split()))
rest.append(0)
rest.append(L)
rest.sort()
print(binary_search())