Ch. 07. echo server, client

Iterative 기반 Server, Client

기본동작 방식

서버는 한 순간에 하나의 클라이언트와 연결되어 에코 서비스를 제공한다.
서버는 총 다섯 개의 클라이언트에게 순차적으로 서비스를 제공하고 종료한다.
클라이언트는 프로그램 사용자로부터 문자열 데이터를 입력 받아서 서버에 전송한다.

서버는 전송받은문자열 데이터를 클라이언트에게 재전송한다. 즉, 에코시킨다.
서버와 클라이언트간의 문자열 에코는 클라이언트가 Q를 입력할 때까지 계속한다.

에코 서버, 에코 클라이언트

클라이언트가 전송하는 문자열 데이터를 그대로 재전송하는 서버

이전까지 서버는 하나의 클라이언트 요청에 응답하고 종료되는 구조였다.

대기큐에 등록된 모든 클라이언트의 연결요청을 수락하기 위해 accept() 부터 과정을 반복시킨다.

에코 클라이언트의 문제점 (1)

read ,write 함수가 호출될 때마다 문자열 단위로 실제 입출력이 이뤄진다.

TCP데이터는 경계가 존재하지 않는다. 

클라이언트는 언제 read 함수를 호출할지 알 수 없다.

문자열이 쪼개져 전송되면 문제가 된다.

에코 클라이언트의 문제점 (2)

read ,write 함수를 통해, 한번에 전송하고 한번에 읽는다.

단, 클라이언트가  write로 보낸 뒤 얼마 뒤에 read 해야 하는지 알 수 없다.

TCP 특성

Flow Control (흐름 제어)

write 함수가 반환되는 시점은 데이터가 전송되는 순간이 아니라 전송할 데이터가 출력 버퍼로 이동 완료되는 시점이다.

TCP는 출력 버퍼로 이동된 데이터의 전송을 보장한다.

read 함수가 호출되는 순간은 데이터가 수신되는 순간이 아니라, 입력 버퍼에 수신된 데이터를 읽는 순간이다.

 

입출력 버퍼는 TCP 소켓 각각에 대해 별도로 존재한다 .
입출력 버퍼는 소켓 생성시 자동으로 생성된다.
소켓을 닫아도 출력버퍼에 남아있는 데이터는 계속해서 전송된다.
소켓을 닫으면 입력버퍼에 남아있는 데이터는 소멸된다.

 

입력 버퍼의 크기를 초과하는 분량의 데이터 전송은 발생하지 않는다.

TCP 소켓 내부 동작 원리

1. 상대 소켓과의 연결

전이중(Full-duplex)

Three way handshaking

SYN 요청

SYN + ACK 요청 확인

ACK 요청 확인 확인

 

 

 

 

2. 상대 소켓과의 데이터 송수신

ACK = SEQ + 전송 바이트 크기 + 1

SEQ와 ACK 를 통해 데이터 송수신

 

 

 

 

 

 

 

- 손실에 대한 재전송

TCP 소켓은 ACK 응답을 요구하는 패킷 전송시 타이머를 통해 TIME OUT시 패킷을 재전송한다.

 

 

 

 

 

 

 

3. 상대 소켓과의 연결 종료

Four way handshaking

종료 요청 보냄

종료 요청 보냄 받음 확인

종료 응답 보냄

종료 응답 보냄 받음 확인

 

 

 

 

 

댓글

공지사항
업데이트
인기 글
최근댓글
태그
socket programming db 방화벽 2진수 음수 표현 우분투 독 에러 c언어 스트림 fgets( ) 개행('\0')과 NULL 처리 mariadb 재설치 리턴 0 이유 How to show/hide the macOS Dock instantly db 외부접속 맥북 독 반응 M1 독 바로 보기 소켓 포인터와 참조 이진수 음수표현 connect() M1 dock speed M1 Parallels Ubuntu QT install mysql 외부 Ip if(0) 알고리즘이란 #define HAVE_STRUCT_TIMESPEC 표준 입출력 스트림 MariaDB Connector/C++ MariaDB Connector 몬트레이 Shift Space mariadb 삭제 socket networking A2449 네이퍼 적립 계산 m1 매직 키보드 2진수 실수 표현 c언어 버퍼 네이버 맴버쉽 계산 mariadb 외부접속 네이버 포인트 적립 계산 MK293KE/A fputc( ) mariaDB 외부 접속 네이버 페이 결제 오류 C2011 'timespec': 'struct' 형식 재정의 littem endian 우분투 독 비활성화 고정 소수점 인터넷 속도 단위 리틀 엔디안과 빅 엔디안 socket 맥 독 반응 속도 stream buffer 버퍼란 윤성우의 열렬 TCP/IP 소켓 프로그래밍 c 알고리즘 mysql 방화벽 m1 페러렐즈 단축키 puts( ) 2진수와 Byte 스트림 버퍼 독 속도 조절 window mysql M1 dock 네이버 적립 C++ connector 우분투 qt 네이버 제휴 통장 적립 if 가독성 효과적인 if 코드 스트림과 버퍼 Apple Silicon Mac용 터치아이디 탑재형 매직 키보드 - 미국 영어 (MK293KE/A) M1 Parallels Ubuntu QT if(false) C# 메서드 return 0 성공 이유 윈도우 timespecs listen() m1 윈도우 단축키 m1 Shift space 우분투 디스코드 윈도우 db 빅엔디안 if 코드 구조 MK293KH/A C networking ubuntu C2027 정의되지 않은 형식 'timespec' c# 클래스 네이버 제휴 카드 적립 m1 페러렐즈 윈도우 맥 단축키 이진수 실수표현 pointer reference io stream 2진법과 기수 fputs( ) Visual Studio에서 inet_ntoa( ) 경고 네이버 맴버쉽 적립 실제 저장 용량 실제 인터넷 속도 Magic Keyboard with Touch ID MariaDB 방화벽 2진법과 서수 몬트레이 한영 전환
«   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