728x90
반응형
오늘 한 건(TCP vs. UDP / 3-way handshake) 따로 각 10줄씩 해서 대본을 만들었당. 어... 막상 면접 가면 어버버 대면서 다 못 말할 가능성이 높지만 그래도 만들면서 머리에 남는 게 있어서 그거에 의의를 두고 만드는 편이다.
흠 근데 공부하고 정리하는 덴 한참 걸렸는데 요약하고 보니 20줄인 거 열받넹
프로그래머스 큐: 프린터
def solution(priorities, location):
answer = 0
from collections import deque
d = deque([(v,i) for i,v in enumerate(priorities)])
while len(d):
item = d.popleft()
if d and max(d)[0] > item[0]:
d.append(item)
else:
answer += 1
if item[1] == location:
break
return answer
solution([1, 1, 9, 1, 1, 1], 0)
# 디큐 사용 안 한 다른 풀이
def solution(priorities, location):
answer = 0
array1 = [c for c in range(len(priorities))] # index 위치 저장
array2 = priorities.copy() # 값 저장 (출력되는 값)
i = 0
while True:
if array2[i] < max(array2[i+1:]):
array1.append(array1.pop(i))
array2.append(array2.pop(i))
else:
i += 1
if array2 == sorted(array2, reverse=True):
break
return array1.index(location) + 1
- 패킷이란
- 인터넷 내에서 데이터를 보내기 위한 경로 배정(라우팅routing)을 효율적으로 하기 위해 데이터를 여러 개의 조각들로 나누어 전송하는 데 이때 이 조각을 패킷이라고 한다.
- 데이터그램이란
- 패킷교환에서 각각 독립적으로 취급되는 각각의 패킷
- 데이터그램 방식
- 패킷교환에서 각 패킷이 독립적으로 처리되어 목적지까지 도달하는 방식
- 비연결형(Connectionless) 방식으로, 사전에 연결 설정을 하지 않는다.
- 각 패킷들을 독립적으로 처리하며, 순서와 무관하게 전달된다.
- 통상적으로 양단간에 요청-응답의 형태를 가진다.
- 목적지가 같은 패킷이라도 항상 같은 경로를 따르지 않는다.
- TCP (Transmission Control protocol)
- 인터넷 상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜
- 일반적으로 TCP와 IP를 함께 사용하는데, IP가 데이터의 배달을 처리한다면 TCP는 패킷을 추적 및 관리한다.
- 현재는 대부분 TCP 프로토콜을 사용한다.
- TCP 특징
- 연결 지향 방식이다.
- 즉 패킷을 전송하기 위한 논리적 경로(→ sequence number 순서 번호)를 배정한다.
- TCP는 3-way handshake 방식으로 두 지점 간 세션 연결을 확인해 통신을 시작한다.
- 목적지와 수신지를 확실히 하여 정확한 전송을 보장하기 위해서 세션을 수립하는 과정을 의미한다.
- 세 번에 걸친 연결 과정을 통해 서로를 인식한 후 데이터를 전송한다.
- 이렇게 되면 중간에 서버에서 응답이 없으면 연결이 안 되면서 데이터를 보내지 않는다.
- 최근에는 ACK(요청 수락)와 함께 데이터도 전송할 수 있다.
- TCP는 4-way handshake를 통해 세션을 종료해 통신을 종료한다.
- 데이터 전달 보증
- TCP에서는 데이터를 전송하면 서버에서 데이터를 잘 받았다는 전달해준다. 전송이 되지 않았다면 서버에 문제가 있음을 인지할 수 있다.
- Sequence Number(순서 번호)를 사용해 순서를 보장함으로써 패킷을 추적 및 관리한다.
- 만약 패킷의 순서가 1,2,3 순서로 보냈는데 받았을때 1,3,2 순서로 도착했다면 잘못 보내진 2번 패킷부터 다시 보내라고 요청한다.
- 데이터 수신지(IP 계층)에서 순서 번호에 따라 재조립 가능
- 데이터의 흐름제어나 혼잡 제어와 같은 기능이 있지만, 해당 기능들이 CPU를 사용하기 때문에 UDP보다 속도가 느리다.
- 패킷에 대한 응답을 해야하기 때문에(시간 지연, CPU 소모) 성능이 낮다.
- 흐름제어 (Flow Control) : 데이터 송신지와 수신지의 데이터 처리 속도를 조절해 수신자의 버퍼 오버플로우를 방지한다.
- 혼잡제어(Congestion Control) : 네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지한다.
- 전이중(Full-Duplex), 점대점(Point to Point) 방식이다.
- 서버와 클라이언트는 1대1로 연결된다.
- 서버소켓은 연결만을 담당한다.
- 연결과정에서 반환된 클라이언트 소켓은 데이터의 송수신에 사용된다
- 스트림 전송으로 전송 데이터의 크기가 무제한이다.
- 연결 지향 방식이다.
- TCP 특징 요약 : TCP는 3-way handshake를 통해 전송 여부를 판단해 데이터 전달을 보장하고, 전송 과정 중 유실 된 패킷을 재전송하는 방식으로 신뢰성을 보증한다. 이외에도 순서 번호(Sequence Number), 흐름제어, 혼잡제어 등의 기능이 있다.
- TCP가 위 특징을 갖는 이유
- TCP는 연결형 서비스로 신뢰성을 보장하기 때문이다. 그래서 3-way handshaking, 데이터의 흐름제어 및 혼잡 제어도 결국 모두 신뢰성을 위한 것
- 인터넷 상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜
- TCP 플래그(flag)
- 플래그 정의 : 컴퓨터에서 무언가를 기억하거나 또는 다른 프로그램에게 약속된 신호를 남기기 위한 용도로 프로그램에 사용되는 미리 정의된 비트
- TCP는 3-way handshake 방식으로 두 지점 간 세션을 연결해 통신을 시작하고, 4-way handshake를 통해 세션을 종룔해 통신을 종료한다.
- 이러한 세션 연결과 해제 이외에도 데이터를 전송하거나 거부 세션 종료 같은 기능이 패킷의 flag 값에 따라 다라지게 되는데, TCP flag는 기본적으로 6가지로 구성된다.
- 순서 : URG → ACK → PSH → RST → SYN → FIN
- 각각 1비트로 TCP 세그먼트 필드 안에 CONTROL BIT 또는 FLAG BIT로 정의돼 있다.
- TCP에서 세션을 성립할 때 가장 먼저 보내는 패킷
- 시퀀스 번호를 임의적으로 설정해 세션을 연결하는 데 사용하며, 초기에 시퀀스 번호를 보낸다.
- 상대방으로부터 패킷을 받았다는 걸 알려주는 패킷으로, 다른 플래그와 같이 출력되는 경우도 있습니다.
- 받는 사람이 보낸 사람 시퀀스 번호에 TCP 계층에서 길이 또는 데이터 양을 더한 것과 같은 ACK를 보낸다. (일반적으로 +1 해서 보낸다)
- ACK 응답을 통해 보낸 패킷에 대한 성공, 실패를 판단해 재전송하고 다음 패킷을 전송한다.
- 재설정(Reset)을 하는 과정이며 양방향에서 동시에 일어나는 중단 작업이다.
- 비정상적인 세션 연결 끊기에 해당한다.
- 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용한다.
- TELNET과 같은 상호장욕이 중요한 프로토콜의 경우 빠른 응답이 중요한데, 이때 받은 데이터를 즉시 목적지인 OSI 7 Layer의 Application 계층으로 전송하도록 하는 플래그
- 대화형 트래픽에 사용되는 것으로, 버퍼가 채워지기를 기다리지 않고 데이터를 전달한다.
- 데이터는 버퍼링 없이 바로 위 계층이 아닌 7계층의 응용프로그램으로 바로 전달한다.
- Urgent pointer란 전송하는 데이터 중에서 긴급히 전달해야 할 내용이 있을 경우 사용한다.
- Urgent pointer가 유효한 것인지를 나타낸다.
- 긴급한 데이터는 다른 데이터에 비해 우선순위가 높아야 한다. ex) ping 명령어 실행 도중 Ctrl+C 입력
- 세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 나타낸다.
- 패킷의 플래그에 SYN, FINISH, RESET, PUSH 등의 플래그가 설정돼있지 않은 경우 이 플래그가 세팅된다.
- 이 플래그는 ACK 플래그와 함께 사용되는 경우도 있다.
- UDP (User Datagram Protocol)
- 정의 : 데이터를 데이터그램 방식으로 처리하는 프로토콜
- 데이터그램 : 패킷교환에서 각각 독립적으로 취급되는 각각의 패킷
- 특징
- 기능이 거의 없어 IP와 거의 같다. +PORT + 체크섬 정도만 추가
- 애플리케이션에서 추가 작업이 필요하다.
- 비연결형 프로토콜로, 데이터그램 방식을 제공한다.→ 따라서 TCP 3 way handshake 지원 X, 정보를 주고 받을 때 정보를 보내거나 받는다는 신호 절차를 거치지 않는다.
- → 따라서 데이터는 서로 다른 경로로 독립적으로 처리된다.
- → 비연결형 서비스이기 때문에 연결을 설정하고 해제하는 과정이 존재하지 않는다.
- 연결을 위해 할당되는 논리적인 경로(→ sequence number)가 없다. = 데이터 순서 전달 보증 X패킷에 순서를 부여하여 재조립을 하지 않는다.
- 흐름 제어와 혼잡 제어와 같은 기능이 없어 패킷이 제대로 전송됐는지, 오류가 없는지 확인할 수 없다.
- 데이터 전달 및 순서가 보장되지 않는 대신 TCP보다 단순하고 빠르며 네트워크 부하가 적다는 장점이 있다.
- UDP헤더의 CheckSum 필드를 통해 최소한의 오류만 검출한다.
- 신뢰성 있는 데이터 전송을 보장하지 못한다.
- 파일 전송 같은 신뢰성이 필요한 서비스보다 연속성이 중요한 서비스, 가령 실시간 서비스(streaming)에 자주 사용한다.
- 서버와 클라이언트는 1대1, 1대N, N대M 등으로 연결될 수 있다.
- 데이터그램(메세지) 단위로 전송되며 그 크기는 65535바이트로, 크기가 초과하면 잘라서 보낸다.
- UDP에는 연결 자체가 없어서(connect 함수 불필요) 서버 소켓과 클라이언트 소켓의 구분이 없다.
- 소켓 대신 IP를 기반으로 데이터를 전송한다.
- TCP vs. UDT
- 참고로 오늘날 실무에서는 스트리밍과 같은 실시간 서비스에서도 TCP 통신이 주로 사용된다.
- 하지만 HTTP3 스펙에서는 UDP가 기본 프로토콜로 채택되면서, 이후에는 어떻게 될지 지켜봐야할 것.
- 3-way handshake : 응용프로그램이 데이터를 전송하기 전, 정확한 전송을 보장하기 위해 상대방 컴퓨터와 세션을 수립하는 과정
- 통신 전 클라이언트는 포트가 닫힌(Closed) 상태이고, 서버는 해당 포트로 항상 서비스를 제공할 수 있는 Listen 상태이다.
- A 클라이언트는 B 서버에 접속을 요청하는 SYN(synchronization sequence number)[접속 요청] 패킷을 보낸다.
- 이때 통신을 위해 임의의 포트 번호가 클라이언트 프로그램에 할당되고, A클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다.
- B 서버는 SYN 요청을 받고 A 클라이언트에게 요처을 수락하는 의미의 ACK(acknowledgement)[요청 수락]와 SYN[접속 요청] 플래그가 설정된 패킷을 발송한다.
- 이때 B 서버는 SYN_RECEIVED 상태가 되고, A 클라이언트가 다시 ACK로 응답하길 기다린다.
- A 클라이언트는 연결 요청에 대한 서버의 응답을 확인했다는 표시로 다시 ACK 패킷을 서버로 보낸다.
- 이때 서버의 상태는 ESTABLISHED가 되고 데이터 통신이 시작된다.
- 두 시스템이 통신하는 중에는 클라이언트와 서버 모두 Established 상태(state)
- 통신을 끊으려는 클라이언트가 서버에 FIN(연결 종료 요청) 패킷을 보내고 클라이언트는 Close Wait 상태가 된다.
- 서버는 클라이언트의 연결 종료 요청을 확인하고 응답으로 클라이언트에 ACK(응답, 요청 수락) 패킷을 보내면 서버도 클라이언트의 연결을 종료하겠다는 의미로 FIN(연결 종료 요청) 패킷을 보내고 Close Wait 상태가 된다.
- 클라이언트는 연결 종료를 요청한 것에 대한 서버의 응답을 확인했다는 표시로 ACK 패킷을 서버에 보낸다.
반응형
'Programming > TIL and WIL' 카테고리의 다른 글
| 스키마, 인덱스, 수직적 확장과 수평적 확장 (0) | 2023.02.08 |
|---|---|
| 파이썬: 데코레이터, 가변 객체와 불변 객체, set 자료형 vs. dict 자료형, list 자료형 vs. tuple 자료형, assert와 raise (0) | 2023.02.07 |
| TIL - 기술 면접 준비1: IP Protocol, HTTP Protocol / 알고리즘 - 큐: 기능 개발 (1) | 2023.02.04 |
| TIL: pathlib, with~as, swagger, re_path (0) | 2023.02.02 |
| TIL : 알고리즘 문제 (포도주 시식, 더 맵게) (0) | 2023.02.01 |