일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- vitis
- Beakjoon
- linux
- Xilinx
- baekjoon
- Zynq
- UNIX
- HDLBits
- boj
- 코딩테스트
- verilog HDL
- 백준
- Bus
- AMBA BUS
- Vivado
- hdl
- Backjoon
- FPGA
- chip2chip
- verilog
- amba
- java
- axi
- 실기
- 정처기
- 정보처리기사
- SQL
- C++
- 리눅스
- 자격증
- Today
- Total
Hueestory
sctp(vs tcp) 본문
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 |