함수정리
서버의 함수 호출 순서
listen( )
#include <sys/type.h>
int listen(int sock, int backlog);
- 인자
- sock : 연결요청 대기상태로 만들고자하는 socket의 fd
- backlog : 연결요청 대기 큐의 크기
- 연결요청이라는 데이터를 받기위해 소켓을 리스닝 소켓으로 만드는 함수이다.
accept( )
#include <sys/socket.h>
int accept(int sock, struct sockaddr* addr, socklen_t* addrlen);
- 인자
- sock : 서버소켓의 fd
- addr : 연결요청 한 클라이언트의 주소정보를 받을 인자
- addrlen : 주소변수의 크기 (byte단위)
- 클라이언트의 연결요청을 수락하는 함수
- 이 과정까지 마치면 소켓간의 데이터의 송수신이 이루어진다. 데이터 송수신이 이루어질 소켓도 생성된다.
클라이언트의 함수 호출 순서
connect( )
#include <sys/socket.h>
int connect(int sock, const struct sockaddr* servaddr, socklen_t addrlen);
- 인자
- sock : 클라이언트 소켓의 fd
- servaddr : 연결요청한 클라이언트의 주소정보를 받을 주소 값
- addrlen : servaddr에 전달된 주소의 변수 크기(byte 단위)

Three-way handshake

- SYN : data를 담지않으며 하나의 sequence number를 소모한다.
- SYN + ACK : data를 담지않으며 하나의 sequence number를 소모한다.
- ACK : data도 sequence number도 갖지않는다.
Data Transfer

- control bit의 P 무시, 마지막의 seq 무시
Termination

- FIN : data는 담겨있지 않지만 sequence number 하나를 소모한다.
- FIN + ACK : data는 담겨있지 않지만 sequence number 하나를 소모한다.
Half-Close
- client가 FIN을 선언(active close)하지만 server에서는 아직 보낼 데이터가 남아있으므로 ack만 보낸 상태
- client측의 sending buffer는 없애고 receiving buffer만 남겨두고 받은 data의 대한 ack 전송한다.
- 후에 server에서 FIN을 선언(passive close)하면 그것에 대한 ack을 보낸후 connection을 종료한다.

연결에 대한 전체적인 개요도


- TIME-WAIT이 필요한 이유?
- server가 FIN + ACK을 보냈을 때 client에서 ACK을 보냈는데 그게 유실되면 서버측에서는 FIN을 한 번 더 보낸다. 이때 server의 FIN을 처리할 수 있도록 잠시 기다린 다음 연결을 종료한다.
- 데이터가 잘못보내진 후 연결이 끊어졌을때 만약 그 client가 다시 연결되면 같은 포트번호를 부여받아 잘못된 데이터를 전송받을 확률이 있으므로 잠시 포트번호를 잡아두어 새로 시작한 연결은 새로운 포트번호를 부여받게끔 한다.