Part 01
Ch. 01. Socket Network Programming
Ch. 02. File Descriptor, open(), close(), write(), read()
Ch. 05. Network Byte Order, Big Endian, Little Endian
Part 2
Ch.10.
Ch.11.
Ch.12.
Ch.13.
Ch.14.
Ch.15.
Ch.16.
Ch.17.
Ch.18.
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
종료 요청 보냄
종료 요청 보냄 받음 확인
종료 응답 보냄
종료 응답 보냄 받음 확인