[Network] 5. TCP 기반 서버/클라이언트 2
이 글은 '윤성우의 열혈 TCP/IP 책'을 기반으로 다양한 정보를 추가해 정리한 내용이다. 저자분이 워낙 유명하시고 설명을 잘하시는 분이니 읽어보고 관심이 있으면 책을 구매해서 학습하길 바란다.
+) 이번 시간 내용은 지난 글과 이어지는 것이니 자세하게 알고 싶다면 지난글을 읽어보길 바란다.
2023.05.23 - [Computer Science/Network Programming] - [Network] 4. TCP와 UDP에 대한 이해
에코 클라이언트의 완벽 구현
지난 시간 TCP 기반 iterative 서버를 구현할 때 write, read 과정에서 데이터의 경계가 없어 문제가 발생했다. 오늘은 그 문제를 어떻게 해결할 수 있을지 이야기 나누어 보겠다.
write가 데이터의 경계를 구분하지 않고 보내고 그걸 read가 읽을 때 끝까지 데이터를 받았는지 아닌지 구분 못해서 우리가 보낸 내용을 덜 받았는데 read를 끝내는 불상사가 일어난다. 그럼 가장 쉬운 해결 방법은 전송된 데이터의 길이만큼 읽어내기 위해 읽는 과정을 반복하는 것이다.
//데이터 전송하기 -> 전송한 길이 : str_len
str_len = write(sock, message, strlen(message));
recv_len = 0;
while(recv_len < str_len) // 보낸 데이터의 길이만큼 받았는지 확인
{
recv_cnt = read(sock, &message[recv_len], BUF_SIZE -1);
if(recv_cnt == -1)
error_handling("read() error!");
recv_len += recv_cnt;
}
message[recv_len] = 0;
printf("Message from server: %s", message);
데이터를 받은쪽이 다시 보낸쪽에 보내서 데이터를 전송한 쪽에서 잘 전송이 되었는지 확인하는 과정이다.
TCP의 이론적인 이야기
1. TCP 소켓에 존재하는 입출력 버퍼
- 입출력 버퍼는 TCP 소켓 각각에 별도로 존재한다.
- 입출력 버퍼는 소켓생성시 자동으로 생성된다.
- 소켓을 닫아도 출력버퍼에 남아있는 데이터는 계속해서 전송이 이뤄진다.
- 소켓을 닫으면 입력버퍼에 남아있는 데이터는 소멸된다.
이런 속성 때문에 슬리이딩 윈도우 프로토콜의 적용이 가능하다.
- 슬라이딩 윈도우 프로토콜
두 호스트 간의 데이터 전송을 위한 일반적인 통신 프로토콜 이다. 오류제어와 흐름 제어 기능을 함께 지원한다. 아래와 같은 기본 절차를 따른다.
2. TCP 내부동작 원리
TCP 프로토콜의 작동은 크게 세 가지 흐름으로 구분한다.
1. 연결 생성 (Connection establishment)
2. 자료 전송 (Data transfer)
3. 연결 종료 (Connection termination)
이때, 신뢰성 있는 연결이 생성되어야 하며, 그 후 자료를 전송하고 마지막으로 연결을 종료하면서 할당된 자원을 반납한다.
- 상대 소켓과의 연결
TCP는 연결을 생성하기 위해 3-way handshaking을 사용한다.
SYN : 클라이언트가 서버에게 SYN 메시지를 보낸다. 이 메시지에 포함된 시퀀스 번호는 임의의 값 A이다. (아래 그림에서는 1000을 의미한다.)
SYN-ACK: 서버가 SYN-ACK 메시지로 응답한다. 이 메시지에 포함된 시퀀스 번호도 임의의 값 B 이다. (아래는 2000) 그리고 응답 번호는 A+1이다. (1000 + 1 = 1001)
ACK : 클라이언트가 서버에게 ACK 메시지를 보낸다. 이 메시지에 포함된 응답 번호는 B+1이다. (2000+1)
- 상대 소켓과의 데이터 송수신
연결이 완료 되면 상대 소켓과 데이터 송수신이 이루어진다.
데이터 송수신을 할 때 ACK 번호는 SEQ번호 + 전송된 바이트 크기 + 1 이다. 이는 패킷의 전송 유무,데이터의 손실 유무까지 확인하기 위함이다.
SEQ 전송시 타이머가 작동하고 SEQ에 대한 ACK가 전송되지 않을 경우 데이터가 재전송된다.
- 상대 소켓과의 연결 종료
4-way handshaking 과정을 거쳐 연결을 종료한다.
종료할 때 이렇게 하는 이유는 일방적인 종료로 인해 데이터의 손실이 발생하는 것을 막기 위함이다.
'Computer Science > Network' 카테고리의 다른 글
[Network] 7. 소켓의 우아한 종료 (0) | 2023.05.28 |
---|---|
[Network] 6. UDP 기반 서버/클라이언트 (0) | 2023.05.28 |
[Network] 4. TCP기반 서버/클라이언트 1 (0) | 2023.05.23 |
[Network] 3. 소켓에 할당되는 IP 주소와 PORT 번호 (0) | 2023.05.18 |
[Network] 2. 소켓의 타입과 프로토콜의 설정 (0) | 2023.05.18 |