전송계층이 해야 할 일
- 다양한 응용 프로그램들이 인터넷을 사용할 수 있는 멀티 인터페이스를 제공
- 전송된 데이터의 무결성을 보장
- 네트워크의 상태는 매우 유동적이기 때문에 이에 맞추어 혼잡 제어
- 연결을 설정하는 문제와 해제하는 문제를 담당
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는 지터 보상, 패킷 손실, 느린 전송 감지 기능들을 제공
- 일 대 일 통신 뿐 아니라 멀티캐스트를 통해 여러 곳에 데이터를 전송할 수 있게 해 줌
혼잡제어
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 상태)
- ECT (ECN Capable Transport): 혼잡 제어 가능 여부
- 초기 상태: ECN 필드가 (0, 1) 또는 (1, 0)으로 설정되어 TCP 연결에서 혼잡 제어가 활성화됨
- 혼잡 발생: 라우터에서 네트워크 혼잡을 감지하면 ECN 필드를 (1, 1)로 설정하여 패킷을 수신 측(호스트 B)로 보냄
- 호스트 B의 응답: 수신 측(호스트 B)은 TCP의 ECE(Explicit Congestion Notification Echo)를 1로 설정하여 송신 측(호스트 A)에게 혼잡 발생을 알림
- 호스트 A의 조치: 송신 측(호스트 A)은 혼잡을 인지하고 다음과 같은 작업 수행
- 슬라이딩 윈도우 크기를 줄임 (혼잡 제어 수행)
- CWR (Congestion Window Reduced)를 1로 설정하여 혼잡 신호에 대한 확인을 전달
소켓 프로그래밍 : 여러 개의 응용 프로그램들이 TCP를 사용하여 통신하는 과정
- 운영체제는 0에서 65535까지의 포트 번호들 중 비어있는 번호를 응용 프로그램에게 제공
- 서버쪽 포트에는 여러 개의 소켓이 연결, 클라이언트들은 포트에 연결된 멀티 소켓에 하나씩 연결됨 ➔ 응용 프로그램들이 통신을 하려면 소켓에 접속해야 함
connect() : 클라이언트 소켓이 서버 소켓과 연결을 시도하는 함수
accept() : connect()를 받아주는 함수, connect() 이전에 accept()가 준비되어야 함(서버쪽 코드 먼저 실행)
send(cs): 소켓에 쓰기write 연산을 하면 데이터를 보낸다는 의미
recv(cs): 소켓에서 읽기read 연산을 하면 데이터를 가져온다는 의미
소켓 통신 과정
- 클라이언트 측
- socket(): 소켓 생성
- connect(): 서버에 연결 요청
- send() / recv(): 데이터를 송수신
- close(): 소켓 종료
- 서버 측
- socket(): 소켓 생성
- bind(): IP와 포트를 소켓에 바인딩, 하나의 포트에 여러 소켓이 연결 가능
- listen(): 여러 개의 소켓들을 사용할 수 있는 상태로 만드는 함수
- accept(): 클라이언트 연결 수락, listen() 함수랑 쌍으로 사용
- send() / recv(): 데이터를 송수신
- close(): 소켓 종료
클라이언트 작업 순서
전화기 준비 → socket()
전화 걸기 → connect()
통화(데이터 송수신) → send() / recv()
전화 끊기 → close()
서버 작업 순서
전화기 준비 → socket()
전화번호(=IP와 포트) 설정 → bind()
전화 수신 대기 → listen()
전화 받기 → accept()
통화(데이터 송수신) → send() / recv()
전화 끊기 → close()
=> 서로 소켓 생성하고, server는 전화를 기다리고 client는 요청하는 구도
'망 (Network)' 카테고리의 다른 글
[네트워크] 전송 계층 (0) | 2024.12.05 |
---|---|
[네트워크] 네트워크 계층 작업과 프로토콜 (0) | 2024.12.04 |
[네트워크] 인터넷 프로토콜(IP) (0) | 2024.12.03 |
[네트워크] 라우팅 알고리즘 (1) | 2024.11.30 |
[네트워크] IP 주소 (1) | 2024.11.30 |