소켓의 생성(2)
socket 함수의 두 번째 인자로 "SOCK_STREAM"을 전달하면, 연결 지향형(TCP) 소켓이 생성된다.
ssocket(PF_INET, SOCK_STREAM,?);
PF_INET : IPv4 프로토콜 체계를 사용한다.
SOCK_STREAM : TCP 전송방식을 사용한다.
? : 기본 설정으로 0을 전달해야 하지만, 나중에 설명하기 위해 '?'로 채웠다.
그렇다면 연결지향형(TCP) 소켓은 어떤 특성을 가지고 있을까?
연결 지향형(TCP) 소켓의 특성은 아래의 사진과 같다.
-
-
위에 사진의 특징 중에서 "데이터의 경계를 구분 안 함"이라는 말은 다음 상황과 같다.
-
"사탕 가게에서 A라는 손님이 사탕 100개를 달라고 했다.
그래서 사탕가게 직원은 A에게 사탕 100개를 2개씩 50번에 걸쳐서 줬다.
그런데 A는 사탕 100개가 다 쌓일 때까지 모아두고, 다 모이자 한 번에 봉지에 담아서 가져갔다."
-
위의 상황을 이전에 포스팅에서 봤었던 write 함수와 read 함수를 이용해서 설명하면
-
" 데이터를 전송하는 컴퓨터 A와 데이터를 받는 컴퓨터 B가 있다고 가정할 때
A가 세 번의 write 함수 호출을 통해서 총 100바이트를 전송했다.
그런데 B는 한번의 read 함수 호출을 통해서 100바이트 전부를 받았다"
-
데이터를 송수신하는 소켓은 내부적으로 버퍼(buffer)를 가지고 있다.
즉, 바이트 단위의 배열을 가지고 있는것이다.
그리고 소켓을 통해 전송되는 데이터는 일단 이 버퍼(buffer), 즉 배열에 저장된다.
그렇기에 데이터가 수신되었다고 해서 바로 read 함수를 호출해야 하는 것은 아니다.
이 배열의 용량을 초과하지 않는 한,
데이터가 채워진 후에 한 번의 read 함수 호출을 통해서
배열에 저장되어 있는 데이터를 전부 읽어 들일 수도 있고,
반대로 한 번의 write 함수 호출로 전송된 데이터 전부를 여러 번의 read 함수 호출로
나눠서 데이터를 읽어 들일 수도 있다.
-
즉, 연결 지향형(TCP) 소켓의 경우에
write 함수의 호출 횟수와 read 함수의 호출 횟수는 큰 의미를 갖지 못한다.
그렇기에 연결지향형(TCP) 소켓은 데이터의 경계가 존재하지 않는다고 말하는 것이다.
즉, "데이터의 경계가 존재하지 않는다"라는 말은
송신과 수신을 하는 함수의 호출 횟수가 서로 같지 않아도 된다는 것이다.
'시작하지 말았어야 했던 것 > (Unix, Linux) C Socket' 카테고리의 다른 글
(리눅스) 소켓의 생성(3) 비 연결지향형 소켓(UDP 소켓)(SOCK_DGRAM) (0) | 2021.02.02 |
---|---|
(리눅스)소켓의 생성(2-1) 소켓에 존재하는 버퍼 내의 데이터 (0) | 2021.02.02 |
(리눅스) 소켓의 생성 (0) | 2021.02.02 |
프로토콜(Protocol)(방법)(통신규약)(약속)이란 (0) | 2021.02.02 |
(리눅스) 파일 읽기 프로그램 (0) | 2021.02.02 |