본문 바로가기
망 (Network)

[네트워크] TCP와 소켓 프로그래밍

728x90

전송계층이 해야 할 일

  • 다양한 응용 프로그램들이 인터넷을 사용할 수 있는 멀티 인터페이스를 제공
  • 전송된 데이터의 무결성을 보장
  • 네트워크의 상태는 매우 유동적이기 때문에 이에 맞추어 혼잡 제어
  • 연결을 설정하는 문제와 해제하는 문제를 담당

TCP : 전송계층이 해야 하는 대표적인 작업을 담당하는 프로토콜

  • 응용 프로그램이 소켓을 통해 인터넷으로 전달할 데이터를 보내면 TCP는 TCP 헤더를 붙여서 IP로 내려 보냄
  • IP는 IP 헤더를 붗여 이더넷으로 내려 보내면 이더넷이 데이터 전송

 

TCP 헤더 = 32bit(4byte) = IP 헤더

TCP 헤더의 필수 부분 = 5 * 4byte = 20byte ( 옵션 있으면 4byte씩 증가)

Source Port : 보내는 쪽 포트

Destination Port : 받는 쪽 포트, 받는 쪽 포트를 알아야지만 데이터를 보낼 수 있음

  • 받는 쪽의 응용 프로그램이 웹 데몬(HTTPD)와 같이 잘 알려진 소프트웨어라면 0에서 1023번까지의 well-known 포트 번호를 가지고 있음
  • 포트번호의 길이는 16비트이다. 따라서 0에서 65535까지의 포트번호를 가짐
  • 일반적인 응용 프로그램이라면 1024 ~ 65535이하의 임의의 값을 포트번호로 할당 받음

Sequence Number = 일렬 번호

Acknowledge Number = ACK 번호  

  • 일련번호와 ACK 번호는 연결을 설정하고 해제하는데도 사용
  • 컴퓨터가 켜진 후 꺼질 때 까지 무수히 많은 수의 데이터를 전송하기 때문에 일련번호와 ACK 번호는 충분히 커야 함
  • 일련번호와 ACK 번호에 32비트를 할당하였기 때문에 0부터 2 32 - 1까지, 약 42억개의 번호를 사용 할 수 있음

THL(TCP Header Length) : 옵션을 포함한 TCP 헤더 길이, 데이터는 포함 되지 않음, 4 바이트 단위, 옵션 없으면 5

ECE(ECN-Echo) : IP헤더에서 ECN과 연동, IP의 ECN이 네트워크가 혼잡하여 윈도우 크기를 줄인다고 결정하면, TCP의 ECE가 1로 바뀜

CWR(Congestion Window Reduced) : 윈도우 크기를 줄였다는 것을 확인하는 필드, ECE를 중복적으로 보내지 않아도 된다는 의미

URG(Urgent) : 긴급하게 처리해야 할 데이터가 있으면 1

ACK : TCP 헤더의 ACK 번호가 의미가 있는 경우 ACK가 1이 됨, ACK가 0이면 ACK 번호는 무시

PSH(push) : 1이 되면, 순서가 맞지 않아도 버퍼에 있는 데이터를 응용 계층으로 무조건 올려 보냄

SYN(Synchronize) : 연결 설정에 사용되는 Connection Request(CR)을 의미, 연결을 설정할 때 SYN 필드가 1

FIN(Finalize) : 연결 해제에 사용되는 Disconnection Request(DR)을 의미, 연결 을 해제 할 때 FIN 필드가 1

RST(Reset) : 연결 설정이나 연결 해제를 원만히 이루어지지 않을 경우 RST는 필드를 1로 만들면 리셋하자는 의미

Window Size : 슬라이딩 윈도우 프로토콜의 윈도우 크기를 나타냄, 윈도우의 크기 필드가 16비트 이기 때문에 윈도우의 최대 크기(ACK 없이 보낼 수 있는 데이터의 개수)는 65536개

 

Checksum : 에러 검사 코드인 체크썸Checksum이 들어 있으며 크기는 16비트, TCP의 체크썸은 헤더와 데이터 모두 검사

Urgent Pointer : 4번 줄 URG(Urgent)가 1이 되면 의미가 생기는 필드, URG가 1이 된 경우, 데이터 중 긴급하게 처리 되어야 하는 위치를 Urgent Pointer가 가지고 있음


 

UDP : 화상회의나 유튜브와 같이 TCP의 작업은 부담스러운 경우를 위해 만든 프로토콜, 일부 패킷이 손실되더라도 빨리 통신

Source Port : 보내는 쪽 포트

Destination Port : 받는 쪽 포트

UDP Length : 데이터를 포함한 UPD의 전체 길이, 단위는 byte

UDP Checksum : 헤더를 포함한 UDP 전체에 대하여 에러검출 코드


 

RTP(Real-time Transport Protocol) : 스트리밍 데이터의 전송을 위해 설계된 실시간 전송 프로토콜

  • 주로 인터넷 전화(VoIP Voice over IP), 동영상 스트리밍, 화상통신과 같은 멀티미디어 통신에 사용
  • 다양한 비디오 및 오디오 포맷을 지원하기 위하여 헤더에서 기능을 추가하거나 뺄 수 있도록 설계
  • UDP 사용하여 빠르게 데이터를 전송하도록 설계

  • RTP는 지터 보상, 패킷 손실, 느린 전송 감지 기능들을 제공
  • 일 대 일 통신 뿐 아니라 멀티캐스트를 통해 여러 곳에 데이터를 전송할 수 있게 해 줌

RTP를 사용하는 경우, RTP 헤더 - UDP 헤더 - IP 헤더 - 이더넷 헤더들이 차례로 붙음

 


혼잡제어

TCP : 는 ECE(Explicit Congestion notification Echo)와 CWR(Congestion Window Reduced) 필드 사용됨

IP : ECN(Explicit Congestion Notification) 사용됨


 

혼잡제어를 사용할 경우 : 호스트 A는 연결설정에서 SYN, CWR, ECE 필드를 1로 만들어 보냄 ➔ 호스트 B는 SYN, ACK, ECE 필드를 1로 만들어 보냄

 

호스트 B가 혼잡제어 사용 안 할 경우 : SYN, ACK만 보냄

 

양쪽이 혼잡제어에 동의하는 경우 

  • ECN 필드: IP 헤더의 2비트로 구성
    • ECT (ECN Capable Transport): 혼잡 제어 가능 여부
      • (0, 0): 혼잡 제어를 사용하지 않음
      • (0, 1) 또는 (1, 0): 혼잡 제어 가능(ECT 상태)
    • CE (Congestion Experienced): 혼잡 발생을 나타냄
      • (1, 1): 혼잡이 발생했음을 의미(CE 상태)

 

  1. 초기 상태: ECN 필드가 (0, 1) 또는 (1, 0)으로 설정되어 TCP 연결에서 혼잡 제어가 활성화됨
  2. 혼잡 발생: 라우터에서 네트워크 혼잡을 감지하면 ECN 필드를 (1, 1)로 설정하여 패킷을 수신 측(호스트 B)로 보냄
  3. 호스트 B의 응답: 수신 측(호스트 B)은 TCP의 ECE(Explicit Congestion Notification Echo)를 1로 설정하여 송신 측(호스트 A)에게 혼잡 발생을 알림
  4. 호스트 A의 조치: 송신 측(호스트 A)은 혼잡을 인지하고 다음과 같은 작업 수행
    • 슬라이딩 윈도우 크기를 줄임 (혼잡 제어 수행)
    • CWR (Congestion Window Reduced)를 1로 설정하여 혼잡 신호에 대한 확인을 전달

소켓 프로그래밍 : 여러 개의 응용 프로그램들이 TCP를 사용하여 통신하는 과정

  • 운영체제는 0에서 65535까지의 포트 번호들 중 비어있는 번호를 응용 프로그램에게 제공
  • 서버쪽 포트에는 여러 개의 소켓이 연결, 클라이언트들은 포트에 연결된 멀티 소켓에 하나씩 연결됨 ➔ 응용 프로그램들이 통신을 하려면 소켓에 접속해야 함

connect() : 클라이언트 소켓이 서버 소켓과 연결을 시도하는 함수

accept() : connect()를 받아주는 함수, connect() 이전에 accept()가 준비되어야 함(서버쪽 코드 먼저 실행)

 

 

send(cs): 소켓에 쓰기write 연산을 하면 데이터를 보낸다는 의미

recv(cs): 소켓에서 읽기read 연산을 하면 데이터를 가져온다는 의미

 

소켓 통신 과정

  • 클라이언트 측
    1. socket(): 소켓 생성
    2. connect(): 서버에 연결 요청
    3. send() / recv(): 데이터를 송수신
    4. close(): 소켓 종료
  • 서버 측
    1. socket(): 소켓 생성
    2. bind(): IP와 포트를 소켓에 바인딩, 하나의 포트에 여러 소켓이 연결 가능
    3. listen(): 여러 개의 소켓들을 사용할 수 있는 상태로 만드는 함수
    4. accept(): 클라이언트 연결 수락, listen() 함수랑 쌍으로 사용
    5. send() / recv(): 데이터를 송수신
    6. close(): 소켓 종료

클라이언트 작업 순서

 

전화기 준비 → socket()

전화 걸기 → connect()

통화(데이터 송수신) → send() / recv()

전화 끊기 → close()

 

서버 작업 순서

전화기 준비 → socket()

전화번호(=IP와 포트) 설정 → bind()

전화 수신 대기 → listen()

전화 받기 → accept()

통화(데이터 송수신) → send() / recv()

전화 끊기 → close()

 

=> 서로 소켓 생성하고, server는 전화를 기다리고 client는 요청하는 구도

 

 

728x90