삽질의 현장/- 네트워크 프로그래밍

#013_Window_Network_클라이언트 서버 통신 (실행 및 연결 확인)

shovelman 2015. 10. 5. 18:56



안녕하세요 삽잡이입니다.


이번 시간에는 TCP 서버와 클라이언트간 실제로 실행이 되는 결과를

PC에서 확인하고, 연결 역시 확인해보도록 하겠습니다.


지금까지 배워온 대기 소켓, 통신 소켓을 실제로 확인해보는 것입니다.

서버와 클라이언트를 통신하기 위한 코드를 보는 것이 아닌,

결과 창만을 확인해보도록 하겠습니다.


 


TCP 서버에서 listen() 함수가 성공적으로 return 이 되면 대기 큐가 생긴다고 했습니다.


cmd 창에서 netstat -a 명령어를 쳐서 네트워크 연결 상태를 확인해보겠습니다.


본인은 9000번 포트를 통해 소켓을 하나 생성했습니다.

이에 'LISTENING' 상태의 TCP 서버가 존재함을 확인할 수 있습니다.

즉, 대기 소켓의 정보를 확인한것입니다.

'로컬 주소'는 내 정보를 말하는 것이고 외부 정보는 '외부 주소'를 말합니다.


자... 이제 

클라이언트가 대기 큐에 들어오고 TCP 서버거 accept() 함수를 통해 통신 소켓을 만들게 되면 

즉, 아래의 그림의 과정을 살펴보도록 하겠습니다.




서버와 클라이언트를 확인할 수 있습니다.

9000번의 포트를 가진 서버(아래)와 해당 서버에 연결되어있는 클라이언트(위)가 

윗 사진에서는 보입니다...



클라이언트를 종료하게 되면

클라이언트는 서버로부터 응답을 받기 위해서 일정 시간 TIME_WAIT 상태로 됩니다.


서버와 클라이언트간 TCP 통신은 종료시 4-way handshaking 방법이 사용됩니다.

즉, TCP간 연결을 위해 3-way handshaking을 했던것과 달리

종료시에는 4-way handshaking를 수행한다는 것입니다.



종료를 하겠다고 하면 종료에 대한 FIN패킷을 서버에게 날립니다.

그렇다면 서버는 클라이언트에게 알겠다고 ACK 메시지를 날립니다.


서버가 ACK을 날리는 동시에 통신 소켓 종료 요청을 하지요...

통신 소켓을 종료하고자 하면 어플리케이션은 프로세스를 종료시킵니다.


그리고 클라이언트에게 종료가 됬다는 FIN패킷을 전송합니다.

클라이언트가 서버로 부터 FIN 패킷을 받게되면 클라이언트는 서버에게 ACK을 전송하고

TIME_WAIT 상태가 되는 것입니다.

왜냐... 

서버로부터 응답을 받을 수 있다고 생각하고 일정 시간동안 TIME_WAIT 상태가 되는 것입니다.


지금까지 클라이언트와 서버간에 실행과 연결 확인을 해봤습니다.

이상 삽잡이였습니다!