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 특징
      1. 연결 지향 방식이다.
        • 즉 패킷을 전송하기 위한 논리적 경로(→ sequence number 순서 번호)를 배정한다.
      2. TCP는 3-way handshake 방식으로 두 지점 간 세션 연결을 확인해 통신을 시작한다.
        • 목적지와 수신지를 확실히 하여 정확한 전송을 보장하기 위해서 세션을 수립하는 과정을 의미한다.
        • 세 번에 걸친 연결 과정을 통해 서로를 인식한 후 데이터를 전송한다.
        • 이렇게 되면 중간에 서버에서 응답이 없으면 연결이 안 되면서 데이터를 보내지 않는다.
        • 최근에는 ACK(요청 수락)와 함께 데이터도 전송할 수 있다.
      3. TCP는 4-way handshake를 통해 세션을 종료해 통신을 종료한다.
      4. 데이터 전달 보증
        • TCP에서는 데이터를 전송하면 서버에서 데이터를 잘 받았다는 전달해준다. 전송이 되지 않았다면 서버에 문제가 있음을 인지할 수 있다.
      5. Sequence Number(순서 번호)를 사용해 순서를 보장함으로써 패킷을 추적 및 관리한다.
        • 만약 패킷의 순서가 1,2,3 순서로 보냈는데 받았을때 1,3,2 순서로 도착했다면 잘못 보내진 2번 패킷부터 다시 보내라고 요청한다.
        • 데이터 수신지(IP 계층)에서 순서 번호에 따라 재조립 가능
      6. 데이터의 흐름제어나 혼잡 제어와 같은 기능이 있지만, 해당 기능들이 CPU를 사용하기 때문에 UDP보다 속도가 느리다.
        • 패킷에 대한 응답을 해야하기 때문에(시간 지연, CPU 소모) 성능이 낮다.
        • 흐름제어 (Flow Control) : 데이터 송신지와 수신지의 데이터 처리 속도를 조절해 수신자의 버퍼 오버플로우를 방지한다.
        • 혼잡제어(Congestion Control) : 네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지한다.
      7. 전이중(Full-Duplex), 점대점(Point to Point) 방식이다.
      8. 서버와 클라이언트는 1대1로 연결된다.
      9. 서버소켓은 연결만을 담당한다.
      10. 연결과정에서 반환된 클라이언트 소켓은 데이터의 송수신에 사용된다
      11. 스트림 전송으로 전송 데이터의 크기가 무제한이다.
    • TCP 특징 요약 : TCP는 3-way handshake를 통해 전송 여부를 판단해 데이터 전달을 보장하고, 전송 과정 중 유실 된 패킷을 재전송하는 방식으로 신뢰성을 보증한다. 이외에도 순서 번호(Sequence Number), 흐름제어, 혼잡제어 등의 기능이 있다.
    • TCP가 위 특징을 갖는 이유
      • TCP는 연결형 서비스신뢰성을 보장하기 때문이다. 그래서 3-way handshaking, 데이터의 흐름제어 및 혼잡 제어도 결국 모두 신뢰성을 위한 것
  • 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로 정의돼 있다.
    SYN(Synchronization : 동기화) - S : 연결 요청 플래그
    1. TCP에서 세션을 성립할 때 가장 먼저 보내는 패킷
    2. 시퀀스 번호를 임의적으로 설정해 세션을 연결하는 데 사용하며, 초기에 시퀀스 번호를 보낸다.
    ACK(Acknowledgement) - Ack : 응답
    1. 상대방으로부터 패킷을 받았다는 걸 알려주는 패킷으로, 다른 플래그와 같이 출력되는 경우도 있습니다.
    2. 받는 사람이 보낸 사람 시퀀스 번호에 TCP 계층에서 길이 또는 데이터 양을 더한 것과 같은 ACK를 보낸다. (일반적으로 +1 해서 보낸다)
    3. ACK 응답을 통해 보낸 패킷에 대한 성공, 실패를 판단해 재전송하고 다음 패킷을 전송한다.
    RST(Reset) - R : 재연결 종료
    1. 재설정(Reset)을 하는 과정이며 양방향에서 동시에 일어나는 중단 작업이다.
    2. 비정상적인 세션 연결 끊기에 해당한다.
    3. 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용한다.
    PSH(Push) - P : 밀어 넣기
    1. TELNET과 같은 상호장욕이 중요한 프로토콜의 경우 빠른 응답이 중요한데, 이때 받은 데이터를 즉시 목적지인 OSI 7 Layer의 Application 계층으로 전송하도록 하는 플래그
    2. 대화형 트래픽에 사용되는 것으로, 버퍼가 채워지기를 기다리지 않고 데이터를 전달한다.
    3. 데이터는 버퍼링 없이 바로 위 계층이 아닌 7계층의 응용프로그램으로 바로 전달한다.
    URG(Urgent) - U : 긴급 데이터
    1. Urgent pointer란 전송하는 데이터 중에서 긴급히 전달해야 할 내용이 있을 경우 사용한다.
    2. Urgent pointer가 유효한 것인지를 나타낸다.
    3. 긴급한 데이터는 다른 데이터에 비해 우선순위가 높아야 한다. ex) ping 명령어 실행 도중 Ctrl+C 입력
    FIN(Finish) - F : 연결 종료 요청
    1. 세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 나타낸다.
    Etc. 그 외 → Placeholder
    1. 패킷의 플래그에 SYN, FINISH, RESET, PUSH 등의 플래그가 설정돼있지 않은 경우 이 플래그가 세팅된다.
    2. 이 플래그는 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 : 응용프로그램이 데이터를 전송하기 전, 정확한 전송을 보장하기 위해 상대방 컴퓨터와 세션을 수립하는 과정
    1. 통신 전 클라이언트는 포트가 닫힌(Closed) 상태이고, 서버는 해당 포트로 항상 서비스를 제공할 수 있는 Listen 상태이다.
    2. A 클라이언트는 B 서버에 접속을 요청하는 SYN(synchronization sequence number)[접속 요청] 패킷을 보낸다.
    3. 이때 통신을 위해 임의의 포트 번호가 클라이언트 프로그램에 할당되고, A클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다.
    4. B 서버는 SYN 요청을 받고 A 클라이언트에게 요처을 수락하는 의미의 ACK(acknowledgement)[요청 수락]와 SYN[접속 요청] 플래그가 설정된 패킷을 발송한다.
    5. 이때 B 서버는 SYN_RECEIVED 상태가 되고, A 클라이언트가 다시 ACK로 응답하길 기다린다.
    6. A 클라이언트는 연결 요청에 대한 서버의 응답을 확인했다는 표시로 다시 ACK 패킷을 서버로 보낸다.
    7. 이때 서버의 상태는 ESTABLISHED가 되고 데이터 통신이 시작된다.
    4-way handshake
    1. 두 시스템이 통신하는 중에는 클라이언트와 서버 모두 Established 상태(state)
    2. 통신을 끊으려는 클라이언트가 서버에 FIN(연결 종료 요청) 패킷을 보내고 클라이언트는 Close Wait 상태가 된다.
    3. 서버는 클라이언트의 연결 종료 요청을 확인하고 응답으로 클라이언트에 ACK(응답, 요청 수락) 패킷을 보내면 서버도 클라이언트의 연결을 종료하겠다는 의미로 FIN(연결 종료 요청) 패킷을 보내고 Close Wait 상태가 된다.
    4. 클라이언트는 연결 종료를 요청한 것에 대한 서버의 응답을 확인했다는 표시로 ACK 패킷을 서버에 보낸다.

 

반응형

+ Recent posts