소켓 및 전송계층

Goofi·2024년 3월 31일
0

프로그램

❗️운영체제관점

사용자 또는 시스템이 실행하려는 작업을 수행하는 명령어나 코드의 집합을 의미한다.

  • 이것은 컴퓨터에서 실행되는 소프트웨어 형태이다.

명령어나 코드의 집합

프로그램을 구성하는 기본적인 구성 요소들을 나타낸다.
즉, 프로그램이 실행될 때 컴퓨터에 의해 수행되는 여러 명령어들이나 코드들의 모음을 의미한다.

운영체제는 프로그램을 실행하고 관리하는 역할을 한다.
프로그램이 실행되면 운영체제는 해당 프로그램에게 시스템 자원을 할당하고 필요한 서비스를 제공한다.

프로세스

❗️운영체제관점

프로세스는 운영체제로부터 시스템 자원(메모리, CPU시간 등)을 할당 받아 실행되는 프로그램의 실행 과정을 나타낸다.

프로시저

❗️운영체제관점

사용자가 어플리케이션을 실행하면, 운영체제가 이를 위해 새로운 프로세스를 생성하고 해당 프로세스를 메모리에 로드하여 실행시키는 과정을 의미한다.

소켓

소켓

소켓은 응용 프로그램에서 TCP/IP를 이용하는 창구 역할을 하며 응용 프로그램과 소켓 사이의 인터페이스를 소켓 인터페이스라고 한다.

소켓의 활용

소켓은 프로그래밍에서 사용되며, 일반적으로 클라이언트-서버 모델에서 사용된다.

클라이언트 소켓은 서버에 연결하여 데이터를 보내거나 서버로부터 데이터를 받을 수 있다. 서버 소켓은 클라이언트의 연결 요청을 받아들이고, 클라이언트와의 통신을 관리한다.

응용 프로그램이 소켓을 사용하지 않는 경우, 해당 응용 프로그램은 네트워크 통신을 직접 처리하지 않고 일반적으로 운영체제나 프레임워크의 API나 라이브러리를 통해 네트워크 통신을 수행
즉, 소켓을 이용하지 않는다고 해서 네트워크 통신을 하지 않는 것은 아니며 소켓을 사용하지 않고 다른 방법을 통해 네트워크 통신을 수행할 수 있다.

소켓의 장점

  1. 유연성: 소켓 프로그래밍은 다양한 운영 체제와 프로그래밍 언어에서 지원되며, TCP/IP와 같은 다양한 네트워크 프로토콜과 함께 사용할 수 있다.

  2. 표준화: 소켓은 네트워크 통신을 위한 표준 인터페이스로 사용된다.

  3. 양방향 통신: 소켓을 사용하면 양방향 통신이 가능하다.

  4. 비동기 통신 지원: 소켓은 비동기적 통신을 지원하여 여러 클라이언트와의 동시 접속을 처리할 수 있다.

  5. 네트워크 프로그래밍의 기본 요소: 소켓은 네트워크 프로그래밍에서 중요한 요소이다.

소켓의 단점

  1. 복잡성: 소켓 프로그래밍은 일반적으로 상대적으로 복잡하다.

  2. 보안 취약점: 소켓 통신은 보안 취약점을 가질 수 있습니다.

  3. 성능 문제: 소켓 통신은 때로는 성능 문제를 유발할 수 있다. 특히, 많은 동시 연결을 처리해야 하는 서버 애플리케이션의 경우 성능 병목 현상이 발생할 수 있다.

  4. 네트워크 환경 의존성: 소켓 통신은 네트워크 환경에 의존한다.

  5. 크로스 플랫폼 이슈: 소켓 프로그래밍은 특정 플랫폼에 종속적일 수 있다.

웹 소켓

브라우저와 서버 사이의 동적인 양방향 연결 채널을 구성한다.
WebSocket은 TCP 위에서 동작하는 프로토콜
웹 소켓을 이용하면 하나의 HTTP 접속으로 양방향 메시지를 자유롭게 주고 받을 수 있다.

xmlhttprequest에서는 통신할 때마다 꼭 요청 헤더가 부여되기 때문에 1바이트의 정보를 송신하고 싶어도 수 킬로바이트에 달하는데 쓸데없는 정보를 보내야 한다.

채팅 입력을 한 문자마다 서버에 송신하고 싶은 경우처럼, 실시간을 추구한 애플리케이션에서는 이 점이 성능 차이로 이어질 가능성이 크다고 할 수 있다.

HTTP vs 웹 소켓 차이점

결정적인 차이는 프로토콜
웹 소켓은 웹 애플리케이션에서 사용되는 특수한 종류의 소켓으로 볼 수 있으며, HTTP와 달리 실시간 양방향 통신

접속한 상태라면 클라이언트나 서버로부터 데이터 송신이 가능하다.
데이터의 송신과 수신에 각각 커넥션을 맺을 필요가 없다. 하나의 커넥션으로 데이터 송수신 가능

통신시 지정 되는 URL
http://www.sample.com/ ➡️ ws://www.sample.com 형식이다.

웹 소켓이 필요한 경우

  • 실시간 양방향 데이터 통신이 필요한 경우.
  • 많은 수의 동시 접속자를 수용해야 하는 경우.
  • 브라우저에서 TCP 기반의 통신으로 확장해야 하는 경우.

https://helloworld-88.tistory.com/215

http://jkkang.net/unix/netprg/chap2/net2_1.html


3.1 트랜스포트 계층 서비스 및 개요

전송 계층

트랜스포트 계층 프로토콜은 각기 다른 호스트에서 동작하는 애플리케이션 프로세스 간의 논리적 통신(logical communication)을 제공한다.

= 애플리케이션의 관점에서 보면, 프로세스들이 동작하는 호스트들이 직접 연결된 것처럼 보인다.

  • 트랜스포트 계층은 애플리케이션 프로세스 간의 통신을 담당
  • 데이터를 전송하고 받는 과정을 관리
  • 송신 측에서 수신 측으로 데이터를 안정적으로 전달

전송 계층과 네트워크 계층 사이의 관계

전송 계층은 호스트 간의 신뢰성 있는 데이터 전송을 담당하고, 네트워크 계층은 패킷의 전달 경로를 결정하여 네트워크 상에서 데이터를 전송합니다. 두 계층은 데이터 전송의 다양한 측면을 처리하여 효율적인 통신을 가능

세그먼트와 데이터그램

세그먼트(segment) : 트랜스포트 계층 패킷을 일컫는 말
TCP에 대한 패킷을 세그먼트(segment), UDP에 대한 패킷을 데이터그램(datagram)이라는 용어로 나타내기도 한다.

인터넷 프로토콜(Internet Protocol, IP)

인터넷의 네트워크 계층 프로토콜
IP 서비스 모델은 호스트들 간에 논리적 통신을 제공하는 최선형 전달 서비스(best-effort delivery service)
즉, IP가 통신하는 호스트들 간에 세그먼트를 전달하기 위해 최대한 노력하지만, 어떤 보장도 하지 않는다.

세그먼트의 전달 보장 X
순서 보장 X
내부 데이터의 무결성(integrity) 보장 X
→ IP는 비신뢰적인 서비스(unreliable service)이다.
💡 각 호스트는 적어도 하나의 IP 주소를 갖고 있다.

3.2 다중화와 역다중화

호스트 대 호스트 전달 (Host-to-Host Delivery)

호스트 대 호스트 전달은 두 호스트 간에 데이터를 주고받는 것을 의미한다.

예를 들어, 컴퓨터 A에서 컴퓨터 B로 데이터를 전송하는 경우가 여기에 해당된다. IP 주소를 사용하여 호스트를 식별하고 IP 패킷을 통해 데이터가 전송됩니다.

프로세스 대 프로세스 전달 (Process-to-Process Delivery)

프로세스 대 프로세스 전달은 호스트 내에서 실행되는 두 개의 프로세스 간에 데이터를 주고받는 것을 의미한다.
각 프로세스를 고유하게 식별하기 위해 포트 번호를 사용하고, 포트 번호를 통해 데이터가 전송된다.

트랜스포트 계층의 다중화 (Transport-layer Multiplexing)

트랜스포트 계층의 다중화는 여러 개의 프로세스가 동시에 트랜스포트 계층 서비스를 사용할 수 있도록 하는 것이다. 하나의 호스트에서 여러 개의 애플리케이션(프로세스)이 데이터를 보낼 때 트랜스포트 계층이 이들 데이터를 하나의 트랜스포트 계층 연결(예: TCP 연결 또는 UDP 소켓)을 통해 전송하는 것을 의미한다. 다중화를 통해 여러 개의 프로세스가 하나의 네트워크 연결을 공유할 수 있다.

다중화

트랜스포트 계층 세그먼트의 데이터를 올바른 소켓으로 전달하는 작업

트랜스포트 계층의 역다중화 (Transport-layer Demultiplexing)

트랜스포트 계층의 역다중화는 받은 데이터를 해당하는 프로세스로 전달하는 것이다. 수신된 데이터를 역다중화하기 위해 트랜스포트 계층은 포트 번호를 사용하여 데이터를 수신할 프로세스를 식별한다. 이렇게 식별된 프로세스에 데이터가 전달되어 해당 프로세스가 데이터를 처리하게 된다.

역다중화

  • 출발지 호스트에서 소켓으로 부터 데이터를 모으고, 이에 대한 세그먼트를 생성하기 위해 각 데이터에 헤더 정보로 캡슐화(encapsulation) 한다.
  • 그 세그먼트들을 네트워크 계층으로 전달한다.

결론

트랜스포트 계층의 다중화는 여러 프로세스가 네트워크를 공유하여 데이터를 전송하는 것을 가능하게 하고, 역다중화는 받은 데이터를 각각의 프로세스로 전달하여 데이터가 올바르게 처리되도록 한다.

3.3 비연결형 트랜스포트 : UDP

UDP

애플리케이션에게 비신뢰적이고 비연결형인 서비스를 제공

  • 통신하려고 하는 종단시스템이 켜져있는지 안켜져 있는지 모르고 메세지를 보낸다.
  • 무조건 속도를 중시하는 게임에서 주로 많이 사용한다.

3.5 연결지향형 트랜스포트 : TCP

TCP

신뢰적이고 연결지향형 서비스를 제공한다.

혼잡 제어(congestion control)

  • 여러 종류의 서비스를 조합하여 제공하는 것을 의미
  • 혼잡한 네트워크 링크에서 각 TCP 연결이 링크의 대역폭을 공평하게 공유하여 통과하도록 해준다.
  • TCP는 데이터의 신뢰성을 보장하기 위해 흐름 제어, 혼잡 제어 및 오류 복구 메커니즘을 포함한 여러 기능을 제공

연결형

주기적으로 데이터를 보낸다.

TCP 연결은 전이중 서비스(full-duplex service)를 제공한다.

전이중 (Full-duplex)

전이중은 동시에 양방향 데이터 전송이 가능한 것을 의미한다. 즉, 동시에 데이터를 송수신할 수 있다.
예를 들어, 전화 통화 시 양쪽 당사자가 동시에 말할 수 있는 것이 전이중이다. 한쪽이 말하는 동안 다른 한쪽도 동시에 듣고 있다.

RTT(round-trip time, 왕복시간)

세그먼트가 전송된 시간부터 긍정 확인응답될 때까지의 시간

TCP의 세 방향 핸드셰이크

연결하고자 하는 두 장치 간의 논리적 접속을 성립하기 위해 사용하는 연결 확인 방식
3번의 확인 과정을 거친다.

서버는 수신된 SYN에 대한 응답으로 연결 변수와 버퍼를 할당하고 초기화한다.
그 다음, 서버는 응답으로 SYNACK을 보내고 클라이언트의 ACK 세그먼트를 기다린다.

클라이언트가 이 세 방향 핸드셰이크의 세 번째 단계를 완료하기 위한 ACK를 보내지 않으면
결국(종종 1분 이상 후에) 서버가 절반만 열린 연결을 종료하고 할당된 자원을 회수한다.

→ 이는 SYN 플러드 공격의 무대가 된다.

TCP 세그먼트(TCP segment)

TCP 헤더 + 클라이언트 데이터

네트워크 계층에 전달되어 네트워크 계층 IP 데이터그램 안에 각각 캡슐화된다.
세그먼트는 네트워크로 송신된다.

TCP가 상대에게서 세그먼트를 수신했을 때, 세그먼트의 데이터는 TCP 연결의 수신 버퍼에 위치한다.
→ 애플리케이션은 이 버퍼로부터 데이터의 스트림을 읽는다.

TCP 연결의 양 끝은 각각 자신의 송신 버퍼와 수신 버퍼를 갖고 있다.

즉, TCP 연결은 한쪽 호스트에서의 버퍼, 변수, 프로세스에 대한 소켓 연결과
다른 쪽 호스트에서의 버퍼, 변수, 프로세스에 대한 소켓 연결의 집합으로 이루어진다.

TCP 세그먼트 구조

헤더 필드

  • 출발지와 목적지 포트 번호(source and destination port number)

  • 체크섬 필드(checksum field)

  • 32비트 순서 번호 필드(sequence number field)

  • 32비트 확인응답 번호 필드(acknowledgement number field)

  • 16비트 수신 윈도(receive window) : 흐름 제어에 사용된다.
    (수신자가 받아들이려는 바이트의 크기를 나타내는데 사용됨)

  • 4비트 헤더 길이 필드(header length field) : 32비트 워드 단위로 TCP 헤더의 길이를 나타낸다.

  • 옵션 필드(option field)
    - 이 필드는 선택적이고 가변적인 길이를 가진다.
    - 송신자와 수신자가 최대 세그먼트 크기(MSS)를 협상하거나 고속 네트워크에서 사용하기 위한 윈도 확장 요소로 이용된다.

  • 플래그 필드(flag field) : 6비트를 포함한다.

  • ACK 비트 : 확인응답 필드에 있는 값이 유용함을 가리키는 데 사용된다.

  • RST, SYN, FIN 비트 : 연결 설정과 해제에 사용된다.

  • PSH 비트 : 이 비트가 설정되었다면 이것은 수신자가 데이터를 상위 계층에 즉시 전달해야 함을 가리킨다.

  • URG 비트
    - 이 세그먼트에서 송신 측 상위 계층 개체가 ‘긴급’으로 표시하는 데이터임을 가리킨다.
    - 이 긴급 데이터의 마지막 바이트의 위치는 16비트의 긴급 데이터 포인터 필드(urgent data pointer field)에 의해 가리켜진다.

데이터 필드

애플리케이션 데이터의 일정량을 담는다.

흐름 제어

TCP는 송신자가 수신자의 버퍼를 오버플로시키는 것을 방지하기 위해 애플리케이션에게 흐름 제어 서비스(flow-control service)를 제공한다.

→ 수신하는 애플리케이션이 읽는 속도와 송신자가 전송하는 속도를 같게 한다.

텔넷(Telnet)

원격 로그인을 위해 사용되는 유명한 애플리케이션 계층 프로토콜
TCP 상에서 실행되며, 한 쌍의 호스트들 사이에서 동작하도록 설계되었다.

SYN 플러드 공격(SYN flood attack)

고전적인 서비스 거부(Denial of Service, DoS) 공격
1.공격자는 핸드셰이크의 세 버너째 단계를 완료하지 않은 상태에서 무수한 TCP SYN 세그먼트를 보낸다.
2.서버의 연결 자원이 반쪽 연결에 할당된다.
3.결국 서버의 연결 자원이 소진됨에 따라 합법적인 클라이언트들이 서비스 거부가 된다.

GBN

GBN 프로토콜은 파이프라이닝을 통해 효율적으로 데이터를 전송하고, 확인 응답을 기다리지 않고도 여러 개의 패킷을 전송할 수 있다. 그러나 윈도우 크기(N)를 초과하여 미확인된 패킷을 전송하지 않으며, 오류가 발생하면 Go-Back 방식으로 해당 패킷부터 다시 전송

파이프라이닝

작업을 여러 단계로 분할하여 각 단계를 병렬로 처리하여 전체 작업의 처리 속도를 향상시키는 기술

SR

수신자에서 오류(손실되거나 변조된)가 발생한 패킷을 수신했다고 의심되는 패킷만을 재전송한다.

단방향 데이터 전송 (Unidirectional data transfer)

단방향 데이터 전송은 데이터가 한 방향으로만 전송되는 것을 의미한다. 즉, 데이터가 한쪽에서 다른 한쪽으로만 이동한다.

예를 들어, 라디오나 텔레비전 방송은 단방향 데이터 전송의 예시이다. 정보는 방송국에서 수신자로만 전송되며, 수신자는 정보를 수신하고 송신자에게 다시 데이터를 보내지 않는다.

양방향 데이터 전송 (Bidirectional data transfer)

양방향 데이터 전송은 데이터가 양쪽으로 전송되는 것을 의미한다. 즉, 데이터가 두 방향으로 이동할 수 있다.

예를 들어, 전화 통화나 이메일 통신은 양방향 데이터 전송의 예시이다. 각 당사자는 상대방에게 데이터를 보내고 동시에 상대방으로부터 데이터를 받는다.

3.7 TCP 혼잡제어

IP계층은 네트워크 혼잡에 관해 종단 시스템에게 어떠한 피드백도 제공하지 않는다.

TCP의 혼잡 제어

네트워크의 혼잡에 따라 연결에 트래픽을 보내는 전송률을 각 송신자가 제한하도록 한다.

TCP 송신자가 자신과 목적지 간의 경로에서 혼잡이 없음을 감지 → 송신율을 높인다.
TCP 송신자가 경로 사이에 혼잡을 감지 → 송신율을 줄인다.

profile
오늘보단 내일이 강한 개발자입니다!!🧑🏻‍💻

0개의 댓글