[Network] 5. TCP 기반 서버/클라이언트 2

2023. 5. 28. 13:39

이 글은 '윤성우의 열혈 TCP/IP 책'을 기반으로 다양한 정보를 추가해 정리한 내용이다. 저자분이 워낙 유명하시고 설명을 잘하시는 분이니 읽어보고 관심이 있으면 책을 구매해서 학습하길 바란다.

 

+) 이번 시간 내용은 지난 글과 이어지는 것이니 자세하게 알고 싶다면 지난글을 읽어보길 바란다. 

2023.05.23 - [Computer Science/Network Programming] - [Network] 4. TCP와 UDP에 대한 이해

 

[Network] 4. TCP와 UDP에 대한 이해

이 글은 윤성우의 열혈 TCP/IP 책을 참고하여 정리하였습니다. 정확한 내용은 도서를 구매해서 참고하시기 바랍니다. TCP/IP 프로토콜 스택 인터넷 기반의 데이터 송수신을 목적으로 설계된 스택 7

mobuk.tistory.com

 

 

에코 클라이언트의 완벽 구현

지난 시간 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 과정을 거쳐 연결을 종료한다. 

종료할 때 이렇게 하는 이유는 일방적인 종료로 인해 데이터의 손실이 발생하는 것을 막기 위함이다. 

 

 

BELATED ARTICLES

more