Hueestory

sctp(vs tcp) 본문

study

sctp(vs tcp)

히명 2024. 12. 11. 09:33

SCTP(Stream Control Transmission Protocol)

- TCP, UDP에 이은 제 3의 차세대 전송 계층 프로토콜
- 메시지 타입 전송


Multi-homing
- 하나의 연결에 여러 IP 주소를 지정할 수 있음
- 하나의 연결에 문제가 발생해도 다른 경로로 자동 전환하여 연결을 유지
Multi-Streaming
- 하나의 SCTP 연결에서 여러 스트림을 설정해 병렬 데이터 전송이 가능
- 하나의 스트림에서 전송 지연이 발생해도 다른 스트림에 영향을 주지 않음

 

 

SCTP 세션 연결(4-way handshake)

- 4단계 구성, TCP-SYN 보안 취약점 해결
#1 INIT
- INIT 신호를 전송하여 연관을 초기화
#2 INIT+ACK
- 상태 쿠키가 포함
- 쿠키 : 쿠키 작성에 해당하는 시간 소인과 MAC 정보
#3 COOKIE-ECHO
- 상태 쿠키를 응답
#4 COOKIE+ACK
- 비밀키를 사용해 상태 쿠키의 인증을 검증한 후 서버는 연관된 자원을 할당

- COOKIE-ACK 응답을 ESTABLISHED 상태로 전송

 

SCTP 세션 종료(3-way handshake)


- TCP와 달리 3단계로 구성
- TCP *Half-open closing 해결하여 상태 관리 최적화
종료 과정
#1 SHUTDOWN
- 연결을 닫을 준비가 되었음을 알림
#2 SHUTDOWN+ACK
- 응답 전송
#3 SHUTDOWN-COMPLETE
- 종료가 완료되었음을 알림


TCP half-open
- server listen, client 전송
- SYN ACK에 대한 ACK 못 받는 경우
- 보내기 전에 한 쪽이 사망하면 ESTABLISHED → TIME WAIT → TCP는 SYN Flooding에 취약 → SCTP에서 해결됨

- STCP는 ECHO가 와야 자원, 포트를 할당하고 연결, IP기반, Port 사용 불가
- TCP는 multi-homing을 서비스 단에서 진행, SCTP는 list만 주면 유효성 확인 후 연결

- 종료의 경우 SCTP는 TCP와 같은 half-open state를 지원하지 않음
- 다른 한 쪽이 닫혀 있어도 데이터를 계속 보낼 수 있음
- 두 endpoint 중 하나가 종료를 수행하면, 각 peer의 연결은 새로운 데이터를 수신하는 것을 중단하고

  큐에 있는 데이터나 SHUTDOWN만 전달

 

<SCTP 소켓 통신>

- TCP/IP 소켓 통신과 매우 유사
- Server : socket(), bind(), listen(), recvmsg(), sendmsg(), close()
- Client : socket(), sendmsg(), recvmsg(), close()

다음과 같은 변경사항 존재
- Type 필드 : SOCK_SEQPACKET, Protocol 필드 : IPPROCO_SCTP로 설정
- 두 가지 새로운 API 제공 : sctp_opt_info(), sctp_peeloff()

다양한 서브루틴 제공
- 서브루틴 : 프로그램이 특정 태스크를 수행하기 위한 명령어


서브루틴 종류

int sctp_opt_info(sd, id, opt, *arg_size, *size);
- SCTP 소켓의 다양한 옵션에 대한 정보를 조회
int sctp_peeloff(sd, *assoc_id);
- 소켓에서 특정 연결을 분리하여 새로운 소켓을 생성하고 해당 연결에 대한 제어를 새로운 소켓으로 넘김
int sctp_bindx(int sd, struct sockaddr * addrs, int addrcnt, int flags);
- SCTP 소켓에 여러 개의 로컬 주소를 바인딩
int sctp_getladdrs(int sd, sctp_assoc_t assoc_id, struct sockaddr **addrs);
- SCTP 연결에 대한 로컬 주소 목록을 가져옴
void sctp_freeladdrs(struct sockaddr *addrs);
- sctp_getladdrs()로 얻은 로컬 주소 목록을 해제
int sctp_getpaddrs(int sd, sctp_assoc_t assoc_id, struct sockaddr **addrs);
- SCTP 연결에 대한 원격 주소 목록을 가져옴
void sctp_freepaddrs(struct sockaddr *addrs);
- sctp_getpaddrs()로얻은 원격 주소 목록을 해제

서브루틴 파라미터
sd : 소켓 시스템 호출에서 리턴된 소켓 디스크립터를 지정
id : 조회할 연관의 식별자를 지정
opt : 확보할 소켓 옵션을 지정
assoc_id : 별도 소켓 설명자로 분기될 연결의 식별자를 지정
flags : bindx() 호출의 동작 방식을 제어하는 옵션을 지정
- 바인딩 작업을 추가, 제거, 교체, 초기화
- SCTP_BINDX_ADD_ADDR, SCTP_BINDX_REM_ADDR,

  SCTP_BINDX_REPLACE_ADDR, SCTP_BINDX_RESET_ADDR
arg_size : 호출자가 제공하는 옵션 특정 구조 버퍼를 지정
size : 리턴된 옵션의 크기를 지정
addrcnt : 배열의 주소 수
sctp_assoc_t : SCTP 연결을 고유하게 식별하는 데 사용되는 타입

'study' 카테고리의 다른 글

routing  (0) 2024.12.11
telnet, ssh  (0) 2024.12.10
pipe, filter, redirection  (0) 2024.12.10
link  (0) 2024.12.10
linux 명령어  (0) 2024.12.10
Comments