티스토리 뷰

SCTP는 2000년 말에 표준으로 채택된 프로토콜이다. 

TCP보다 더 나은 서비스를 제공하기 위한 목적으로 나타나게 되었다. 


TCP를 개선하라 했을때 어떤 점을 개선하면 좋을까?

TCP의 경우 연결 설정 과정을 3way hand shaking을 통해서 하게 되는데, 이 과정이 별로 안전하지 않아서, 악의적인 클라이언트에 의해 공격을 받을수 있다.


1. Network layer 와 Transport layer에서 보안 서비스를 제공 하면 좋겠다.

2. 네트워크 계층, 전송 계층에서의 에러상황을 유저 프로세스 상에서 알 수 있으면 좋겠다.(운영체제가 무엇이냐에 상관없이)

->notification service(현재 8가지 존재)를 위한 시스템콜 존재함.


마치 UDP 소켓처럼 SCTP 소켓 하나만 사용해서 다수의 사용자들에게 서비스를 제공하지만 , 연결지향형 소켓이다. 


TCP에서는 connection 이라고 표현했지만 같은말을 SCTP에서는 Association이라고 표현한다.(클라이언트와 서버 소켓 사이의 연결)


다수의 클라이언트와 하나의 서버의 하나의 sctp소켓을 통해 통신한다고 할때 association의 개수는 여러개이다. 

서버의 커널 내에서는 association을 구별할수 있게 하기 위해서 식별자가 존재한다. 하지만 프로그래머가 일일이 지정할 필요는 없다.


만약에 클라이언트가 웹서버에게 사진 파일 5개와 동영상 파일 1개를 요청했다고 해보자. 이때, 서버와 클라이언트가 TCP로 통신한다고 했을때, 

1,2,3,4,5사진과 동영상 1개를 차례대로 소켓을 통해서 보낼것이다.


그런데, 만약에 중간에 3번 사진파일이 누락되었다고 해보자. 예전에 TCP는 중간에 데이터 전송에 대한 ack(3번사진)을 못받은 경우 뒤에 보낸 사진파일(4,5)에 대한 ack를 받았다 하더라도 3번부터 다시 파일을 보내주기 때문에 비효율적이었다.(Go back N 방식)

 나중에 이런 방식은 효율적으로 바뀌었는데,Selective Ack로 방식이 바뀌었다. 누락된 ACK에 대한 파일만 다시 재전송 하는 방식이다.


TCP의 경우 사진1,2,3,4,5를 차례로 보내므로 사진이 모두 도착하기 전에 브라우저 렌더링을 하지 않는 브라우저의 경우 5사진파일이 도착할때까지 기다려야 한다. 그런데 SCTP소켓을 사용해서 통신하는 경우 각각의 독립적인 파일들은 각각 독립적인 스트림으로 따로 전송되고 그 논리적인 스트림에서 각 파일에 대한 ACK만 전송된다.(병렬적으로) -> Head of Line Blocking 현상


그렇기 때문에 브라우저 렌더링에 걸리는 시간이 줄어들수 있다.


TCP를 사용하나 SCTP를 사용하나 전체 네트워크의 대역폭에는 영향을 미치지 않는다. SCTP의 경우 대역폭을 여러개의 논리적인 채널로 나누는 것이다. 


http에 sctp소켓이 많이 사용되기 시작한 이유가 바로 위의 예이다. 이런 특징을 멀티 스트림이라고 한다.


HOL(Head of Line) 블로킹은 동일한 송신 포트 자원에 대한 처리량 경쟁으로 인해 처리량 지연 및 프레임 손실 발생을 유발한다. HOL 블로킹은 패킷을 대기 행렬에 넣으며 대기열의 머리에 있는 패킷은 
대기열의 끝에 있는 패킷보다 먼저 전달된다.

 

이 HOL 차단 현상을 교차로 예로 설명될 수 있다. 교차로가 편도 1차선씩 왕복 2차선으로 되어 있다고 가정하자.

 

나는 우회전을 하려한다. 근데, 나 바로 앞에 차가 한 대 있는 데 얘는 직진을 원한다.

지금 현재 교차로의 다른 차도에는 아무 차도없어 내가 우회전해서 가려는 차도로 가려는 차가 없다.

그래서, 난 오른쪽 깜박이 넣고 그냥 우회전하면 되는 데, 내 앞의 차가 직진 신호를 기다리고 있어 난 못 같다. 대단히 억울하다.

 

이 때 만약 내가 온 차도가 편도 2차선이었으면 그래서 직진하려는 차가 1차선에 서고 우회전하려는 차는 2차선으로 진입한다면 난 교차로에 오자마자 바로 우회전해서 갈 수 있을 것이다. 그러나 1차선으로 되어 있기 때문에(라우터의 경우 FIFO큐이기 때문에), 어쩔 수 없이 나보다 먼저 교차로에 온 직진하려는 그 차가 가고 나서야 내가 우회전할 수 있다.




SCTP의 MULTI-HOMING서비스


서버는 여러개의 네트워크 인터페이스를 가지고 있고, 따라서 아이피주소도 여러개를 가지고 있을수 있다.

클라이언트와 서버가 SCTP소켓을 통해서 통신을 하다가 A라는 서버 IP주소를 사용하는 SCTP소켓이 망가졌거나 종료됬거나 그 경로에 있는 라우터가 고장난 경우 A라는 주소를 통해서 통신이 불가능 하므로, 서버의 또다른 IP주소인 B,C,D...등을 이용해서 통신을 지속해야 한다.


SCTP소켓을 사용하게 되면 이런 경우에서 자동으로 B,C,D 중에서 하나의 IP주소를 선택해서 계속해서 클라이언트와 통신을 하게끔 해준다.

클라이언트 입장에서는 프로그램이 종료되거나 하지 않고, 아무일도 없던것 처럼 서버와 계속해서 통신을 할수 있게 되는 편리한 서비스이다.



SCTP의 경우 커넥션 과정(association)에서 데이터를 보낼수 있다.

연결 지향형이지만 udp소켓 사용하는것처럼 커넥트를 따로 호출하지 않아도 sctp_sendto에서 알아서 해준다.


sctp 클라이언트는 sendto recv close를 순서대로 반복한다. tcp에서는 close할때 바로 소켓을 없애지 않았다.



INIT CHUNK ,INIT ACK CHUNK -> SCTP에서 사용되는 패킷의 단위를 청크라고함.

클라이언트가 나중에 동일한 서버에 접속했을때 서버가 예전에 줬던 쿠키정보를 주고 받을수 있도록 쿠키에코와 쿠키애크를 주고받는다.

쿠키는 클라이언트와 서버사이의 인증 정보를 주고 받는다(Authentication)


COOKIE_ECHO 에서 데이터를 피기배킹한다. 합법적인 클라이언트라고 서버가 판단될 경우 쿠키 애크를 보낸다.


sctp_sendto 시스템콜을 호출할때 connect()를 커널이 알아서 시작하는것이고, 매개변수로 데이터를 같이 전달할수 있다.


FIN과 비슷한 SHUTDOWN이라는 청크를 SCTP에서는 연결 종료를 위해서 전송한다.

TCP의 경우에는 FIN을 보내서 하프클로즈를 시작한 active-close한 클라이언트가 ack를 받고 그다음 서버가 fin을 보냈을때

2ms동안 기다렸다가 소켓을 없앤다.


유저 프로세스에서 close()를 호출하게 되면 SHUTDOWN 청크를 상대방에게 보낸다. 근데 상대방이 보낼 데이터가 있었으면 data를 보내고 그걸 수신한 클라이언트는 다시 셧다운 청크를 보내고 이때 상대방도 보낼 데이터가 없었다면 셧다운 애크를 보낸다. 그러면 다시 클라이언트가 셧다운 컴플릿 청크를 보내면서 연결이 종료된다.



위의 그림은 SCTP 헤더에 들어가는 포맷이다.

TSN = TCP에서 사용하는 시퀀스 넘버와 같음. 패킷의 번호를 나타내기 위해서 사용함.

SSN = 멀티 스트림 중에서 몇번 스트림을 사용하는가에 대한 정보

User Data = SCTP 헤더에 데이터를 피기배킹해서 보내는 경우 데이터가 들어감.









댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함