소켓의 옵션 설정
c
// 소켓의 옵션 확인
int getsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
// 소켓의 옵션 변경
int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
/*
- sock : 소켓
- level : 확인할 옵션의 프로토콜 레벨
- optname : 확인할 옵션의 이름
- optval : 저장을 위한 버퍼
- optlen : optval 주소 값의 버퍼크기
*/
주소할당(bind) 에러
- reuseadr_eserver.c 와 echo_client.c를 컴파일 후 함께 구동.
- 서버에서 구동을 멈추게 한다. (ctrl + c를 누르면 된다)
이 경우 bind() 에러가 뜨면서 서버의 재실행에 문제가 생긴다.
reuseadr_eserver.c만 컴파일 후 실행하면 문제가 없다.
time-wait 상황
이유는 서버 쪽 소켓이 완전히 종료된 것이 아니기 때문이다.
이러한 상황을 time-wait 상황이라고 하며, 4-way handshake와 관련이 있다.
- 서버가 갑자기 종료되도 클라이언트에게 종료되었다는 메시지를 보내야 한다.
- 이 과정을 위해 소켓이 종료되었다고 해도 여전히
그러나, 이로 인한 불편함은 어쩔 수 없는 문제이다.
따라서 이를 수정하기 위해 다음과 같은 작업을 거친다.
c
optlen = sizeof(option);
option = TRUE;
setsockopt(serv_sock, SOL_SOCKET, SO_REUSEADDR, (void *)&option, optlen);
SO_REUSEADDR의 디폴트 값을 바꾸어 줌으로써 바로 재실행이 되게 함.
디폴트 값 = 0 → 1로 변경해서 할당이 가능하게 바꾸어줌.
nagle 알고리즘
앞서 전송한 데이터에 대한 ACK 메시지를 받아야 다음 데이터를 전송하는 알고리즘.
네트워크 상 패킷들이 흘러넘치는 것을 방지하기 위한 방법.
네이글 알고리즘을 적용 시 송수신시 필요한 패킷의 수를 줄일 수 있다.
c
"Nagle"을 보낸다고 쳐보자.
- Nagle 알고리즘 적용 시 총 4개의 패킷을 사용한다.
1. 'N'을 보낸다.
2. 'N'에 대한 ACK를 보낸다.
3. 'agle'을 보낸다.
4. 'agle'에 대한 ACK를 보낸다.
Nagle 알고리즘 미적용 시 총 10개의 패킷을 사용한다.
1. 'N'을 보낸다.
2. 'A'를 보낸다.
...
6. 'N'에 대한 ACK를 보낸다.
7. 'A'에 대한 ACK를 보낸다.
...
단, 네이글 알고리즘의 적용 여부에 따른 트래픽 차이가 크지 않으면서도 Nagle 알고리즘을 적용하는 것보다 데이터의 전송이 빠른 경우에는 이를 해제해 주는 것이 좋다.
Nagle 알고리즘 해제 방법
다음과 같이 TCP_NODELAY를 바꿔주면 된다.
c
int opt_val = 1;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *)&opt_val, sizeof(opt_val));
Nagle 알고리즘 적용 여부 확인
c
int opt_val;
socklen_t opt_val;
opt_len = sizeof(opt_val);
getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *)&opt_val, sizeof(opt_val));