본 글은 공부를 위해 작성된 글입니다.
전문성이 없으며 부정확한 글이 존재할 수 있습니다.
#include "stdafx.h"를 함으로써 미리 컴파일 된 헤더를 사용한다.
winsock2.h와 ws_32.lib 같은 경우 window os에서 네트워크 프로그래밍을 하기 위해 사용한다.
라이브러리 로딩을 위해 윈속을 초기화 하고 시작한다.
Server port를 25000번으로 설정하고 서버를 실행시켜 보겠다.
socket() 함수로 소켓을 만들고 bind()로 정보 입력 후 listen() 함수로 LISTENING 상태로 전환한다.
cmd를 통해 확인 시 현재 LISTENING 상태 인 것을 확인할 수 있다.
이제 Client를 실행하여 연결해 보겠다.
연결할 ip는 127.0.0.1 (Loopback address)를 사용하였다.
와이어 샤크를 통해 확인하면 client port가 59485로 설정되어 연결을 하려는 모습이다.
클라이언트가 syn을 서버로 보내고 서버가 그에 대한 응답으로 syn+ack를 보내고 마지막으로
클라이언트가 ack를 보낸다.
서버와 클라이언트의 sequence number은 모두 0으로 설정되어 있는 상태이다.
client를 통해 서버로 "Hello"라는 단어를 보내보겠다.
4번 째 줄 로그부터 순서대로 보도록 하면
59485(클라이언트)가 25000(서버)에게 PSH,ACK를 보낸 것을 확인 할 수 있다.
이것이 바로 Hello라는 단어를 보낸 것, 와이어샤크 로그로 확인이 가능하다.
이후 잘받았다는 신호가 생긴다.
이후 2개의 로그는 서버가 echo 서버이므로 받은 데이터를 다시 보내고 클라이언트가 받은 것이다.
이후 클라이언트를 종료하면?
4way-handshaking을 통해 연결을 끊은 모습
클라이언트가 FIN,ACK를 보내고 서버가 ACK를 보내고 다시 서버가 FIN,ACK를 보내고 클라이언트가 ACK를 보냄으로써 연결이 종료된다.
서버를 먼저 종료한다거나 클라이언트가 강제종료되는 경우 (오류)
리셋이 발생하게 된다.
------------------------------------------------------------------------------------------------------------------
이번엔 한번 break point를 사용하여 연결을 제어해보도록 하겠다.
만약 서버가 LISTENING 상태로 들어가기 전 클라이언트가 연결을 시도한다면?
클라이언트가 SYN을 보냈으나 서버가 LISTENING 상태가 아니라 대량의 오류를 뱉는다.
break point로 조절 중에 알게된건데 send를 통해 보냈을 시 recv()를 통해 받을 때 ACK를 보내는게 아니라
그냥 send()를 보내면 ACK를 보내서 반응한다는 것
recv()는 별도로 무엇을 보내 반응하지 않는다는 것이다.
recv()는 단순이 소켓에서 데이터를 받는 역할만 해서 그렇다는데... 자세한 이유가 궁금하다.