Network

[Network] 흐름 설명

Binceline 2018. 9. 30. 02:33

- Socket은 커널 오브젝트이다.

- Local / Remote의 IP 주소를 가진다.


Server

1. socket() system call로 소켓 생성

2. bind() system call로 주소 및 포트설정

3. listen() system call에 bind로 설정한 소켓과 backlog값 설정.

1) listen()을 호출하게 되면 커널에서 SYN backlog, Accept backlog라는 2개의 queue를 생성한다(3 way handshake 준비).

- backlog : backlog queue의 크기 설정

2) Client로부터 SYN 요청이 들어오면 해당 소켓 정보를 SYN backlog queue에 저장한 후, SYN + ACK를 해당 Client에 보낸다.

- Timeout 발생 시 재시도(설정 가능)

- 이 과정이 끝나면 3 way handshake의 마지막 단계인 Client로부터의 ACK를 기다림

3) Client로부터 ACK 패킷이 오면 해당 소켓 정보를 SYN backlog queue에서 제거하고 Accept backlog queue에 추가

* backlog값이 backlog queue의 크기를 말한다고 했다. 이는 아직 ACK가 처리되지 않은 소켓의 수를 의미한다. 그러므로, RTT(Round Trip Time)가 크다면 통신시간이 길어진다는 뜻이므로 이 queue의 크기를 크게 잡는 것이 좋을 것이다.

* backlog가 꽉차면 새로 수신되는 패킷은 버려지며, overflows와 drop 카운터가 증가한다(SYN Drop 발생).


4. accept() system call로 listen()에서 설정된 accept backlog queue에서 소켓 정보를 하나 가져와 생성한다.

- Accept backlog queue가 비어있다면 block되며, 데이터가 들어올 때까지 대기한다.

- windows에서는 AcceptEx()라는 비동기 함수를 제공한다.



반응형