[ TCP 소켓 프로그래밍 ]
인터넷 : 프로그램과 프로그램의 연결
TCP : 연결 지향 프로토콜
UDP : 데이터 그램 프로토콜
[ 패킷 통신과 TCP ]
인터넷에서의 통신은 패킷 형태로 이루어진다. 목적지 까지의 다양한 경로가 가능하기 때문에 패킷의 순서가 변경되거나
패킷이 누락될 수 도 있다.
< TCP 특징 >
① 연결 지향 ( connection-oriented ) → 서버와 클라이언트간의 전용 선로를 개설하거나 세션을 생성한다.
→ Three-way handshake : 3번의 패킷 교환으로 세션을 개설한다.
② 신뢰성 있는 데이터 교환 : 모든 패킷 전송에 대한 응답을 확인한다.
[ TCP 소켓 프로그램 개발 ]
socket( AF_INET, SOCK_STREAM, 0 )
0 : default protocol → 알아서 설정해준다.
서버 측 소켓 설정
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(8080)
bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
서버 측에서는 클라이언트의 특정 대상을 알 수 없기 때문에 누구나 받겠다는 의미의 INADDR_ANY를 사용한다.
INADDR_ANY : 0.0.0.0 → bind할 주소를 의미한다.
[ Buffers in TCP streams ( Connection-Oriented Data Transfer ) ]
클라이언트가 write를 하는 데이터의 양이 많든지 적든지 간에, 데이터는 TCP 소켓을 타고 서버측의 버퍼로 합쳐져서
전달이 된다. 클라이언트에서 데이터의 양을 분배해서 전달을 하더라도 서버 측에서는 데이터의 양을 합쳐서 수신한다.
ex) 서버에서 300 바이트의 데이터를 수신할 때 클라이언트가 100,200 바이트로 분배해서 데이터를 전송한건지
한번에 300 바이트를 전송한건지 등 어떻게, 얼마나 나눠서 전송했는지를 알 수 없다.
즉, 클라이언트가 데이터를 write 하는 순간에 바로 데이터가 서버로 전송되는 것이 아니다.
< TCP를 통해 메시지를 구별하는 방법 >
1. 고정된 사이즈의 메시지
2. marker : 특정한 character → message와 message의 seperator
클라이언트는 메시지를 보내고 marker를 보내는 것을 반복한다. 그러면 서버는 marker와 marker 사이에 메시지가
존재함을 알 수 있다. 하지만 메시지 내의 똑같은 형태의 marker가 존재하면 안된다. 즉 marker는 메시지 내의
똑같은 형태로 존재하면 안되기 때문에 송신 측에서 메시지 내의 marker가 있으면 다른 형태로 변환해서 전송하는 등의
테크닉이 필요하다.
3. 메시지 사이즈를 전송한다.
송신 측에서 메시지의 길이가 얼마인지, 메시지의 sequence 순서 등으로 구성된 고정된 크기의 header를 구성한다.
수신 측은 헤더를 먼저 받고 전달 받을 메시지의 사이즈를 측정 및 추출해서 메시지를 읽어야 한다.
송신 측에서 데이터를 가변 크기로 전송한다 하더라도 수신 측에서는 알아서 잘 받을 수 있어야 한다.
[ Solving the TCP Message Problem ]
클라이언트가 메시지를 4개 전송했다. 그 중 3개는 다 서버로 수신이 제대로 되었지만 1개가 메시지의 일부만 수신이
되었을 경우 문제가 발생한다.
서버에서는 메시지 하나하나를 FIFO queue로 만들어서 전달해야한다. 첫번째로 수신된 메시지는 읽어야 하는
메시지 칸에 넣어놓고 그 이후의 메시지는 모두 FIFO queue에 넣어놓는다. 하나의 메시지가 일부만 전송이 될 경우
해당 메시지의 일부는 따로 storage에 넣어놨다가 남은 일부가 다 수신될 경우에 합쳐서 FIFO queue에 넣는다.
* 스트림은 한번에 들어오는 것이 아니라 하나하나씩 졸졸졸 들어오는 의미이다.
'2CHAECHAE 학교생활 > OSNW실습' 카테고리의 다른 글
[ OS/NW 실습 ] 8주차 - 멀티 프로세스 소켓 프로그래밍 ① (1) | 2022.10.31 |
---|---|
[ OS/NW 실습 ] 8주차 - UDP 소켓 프로그래밍 (0) | 2022.10.30 |
[ OS/NW 실습 ] 7주차 - 바이트 순서( Byte Order ), 인터넷 주소와 도메인 (0) | 2022.10.29 |
[ OS/NW 실습 ] 6주차 - 소켓 네트워크 프로그램 이해 (0) | 2022.10.29 |
[ OS/NW 실습 ] 6주차 - 소켓 네트워크 프로그램 개발 ② 서버 프로그램 만들기, 리눅스 클라이언트와 서버 코드 분석하기 (0) | 2022.10.29 |