소켓을 활용한 소켓 통신의 개념을 알아봅시다.
😜 추가 지식
- 프로토콜 : 원래 외교상의 언어로써 의례나 국가간의 약속을 의미하며, 통신에서는 어떤 시스템이 다른 시스템과 통신을 원활하게 수용하도록 해주는 통신 규약, 약속
- IP : 전 세계 컴퓨터에 부여된 고유의 식별 주소
- 포트 : 포트는 네트워크 사엥서 통신하기 위해서 호스트 내부적으로 프로세스가 할당받아야하는 고유한 숫자이다. 한 호스트 내에서 네트워크 통신을 하고 있는 프로세스를 식별하기 위해 사용되는 값이므로, 같은 호스트 내에서 서로 다른 프로세스가 같은 포트 넘버를 가질 수 없다. 즉, 같은 컴퓨터 내에서 프로그램을 식별하는 번호이다.
EX ) 161.25.10.8 : 1625 (빨간색 : IP주소, 파란색 : 포트 주소)
서버의 정보 또는 DNS를 통해 만들어야 할 소켓의 정보를 가져옴.
socket(): 속성들이 비어있는 새로운 소켓을 생성.
bind(): 1번에서 가져온 정보들을 소켓에게 부여. (바인딩)
listen(): 소켓을 LISTEN 상태로 만듬.
😜 추가 지식
- LISTEN 소켓 : 클라이언트의 연결 요청을 기다리는 소켓. 연결 요청이 오게되면 본인을 복제한 새로운 소켓을 만들어 네트워크 통신을 연결.
클라이언트와 서버간의 네트워크 연결을 확인하는 과정
통신간의 신뢰성을 보장하는 TCP 통신의 연결 확인 과정
소켓통신의 연결을 위해 3-way handshaking, 연결 종료를 위해 4-way handshaking을 진행
서버에 여러 요청이 들어올 경우, 서버는 이를 저장해놓고 차례대로 처리하기 위해 2개의 queue를 가지고 있음
incomplete queue
: 서버에 들어온 연결요청들을 저장해놓는 queue. 아직 완전히 연결된 상태가 아니며, 서버가 해당 요청들에 대해 클라이언트에게 연결확인 정보를 전송.complete queue
: 클라이언트에게 연결완료 정보를 받아 완전히 연결된 상태가 된 요청정보들을 저장하는 queue. 네트워크 연결이 완료되었기 때문에 순서대로 pop되면서 본래 수행하려던 작업들을 수행.3 Way Handshaking 과정
1. 클라이언트는 socket()을 실행하여 CLOSED 소켓을 생성합니다.
클라이언트는 이후 connect()를 실행합니다. connect() 함수는 블록된 상태가 되어 종료되지 않습니다.
2-1. 서버에게 연결요청 정보(SYN)를 전송합니다.
2-2. 소켓의 상태를 SYN-SENT로 설정합니다.
서버의 LISTEN 소켓이 요청을 받게 되면, 서버는 accept()를 실행합니다. accept()함수는 블록된 상태가 되어 종료되지 않습니다.
3-1. 클라이언트에게 연결확인 정보(SYN)를 받아 새로운 소켓을 생성하고, 소켓의 상태를 SYN-RECEIVED로 설정합니다.
3-2. 연결 정보에 새로운 소켓을 매핑하고,
incomplete queue
에 push합니다.3-3. 클라이언트에게 연결확인 정보(SYN + ACK)를 전송합니다.
클라이언트는 서버에게 연결확인 정보(SYN + ACK)를 받고, connect() 함수는 블록이 해제됩니다. 아래 과정을 수행한 후 connect()는 종료됩니다.
4-1. 연결확인 정보(SYN + ACK)를 받고 소켓을
ESTABLISHED
로 설정합니다.4-2. 서버에게 연결완료 정보(ACK)를 전송합니다.
서버는 클라이언트에게 연결완료 정보(ACK)를 받고, accept() 함수는 블록이 해제됩니다. 아래 과정을 수행한 후 accept()는 종료됩니다.
5-1. 연결완료 정보(ACK)를 받고 소켓을
ESTABLISHED
로 설정합니다.5-2. 연결 정보를
incomplete queue
에서 pop하고,incomplete queue
에 push합니다.
write()
: 프로세스는 보내고자 하는 메세지나 파일들은 Buffer에 작성.(write) 이후 버퍼를 소켓을 통해 다른쪽의 소켓에게 전송.(send)read()
: 다른쪽의 소켓에게서 Buffer를 수신.(recv) 이후 버퍼에서 메세지나 파일을 읽음.(read)😜 추가지식
버퍼 : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역.
😡 주의사항!!
그림에서 서버가 클라이언트로 보내는 버퍼 안의 메세지는 hello가 아니라 world입니다. 그림 자료에 오류가 있으니 헷갈리지 마세용!
4 Way Handshaking 과정
- 클라이언트는 close()를 실행하여 서버에게 연결해제 요청(FIN)을 보내고, 소켓의 상태를 FIN_WAIT1로 설정합니다.
- 서버는 클라이언트에게 연결해제 확인(ACK) 정보를 보내고, 소켓의 상태를
CLOSE_WAIT
으로 설정합니다. 서버는 남아있는 클라이언트의 요청을 모두 처리하여 클라이언트에게 보내고, 이후close()
를 실행합니다.
- 클라이언트는 서버에게 연결해제 확인(ACK) 정보를 받은 후, 소켓의 상태를
FIN_WAIT2
로 설정합니다. 이후 서버에게서 오는 모든 요청들을 받으며 연결해제 요청(FIN)을 받기를 기다립니다.
- 서버는 클라이언트에게 연결해제 요청(FIN)을 보내고, 소켓의 상태를 LAST_ACK로 설정합니다.
- 클라이언트는 서버에게 연결해제 요청(FIN)을 받은 후 연결해제 확인(ACK) 정보를 보내고 소켓을 삭제하며 네트워크 통신을 종료합니다.
- 서버는 클라이언트에게 연결해제 확인(ACK) 정보를 받은 후 소켓을 삭제하며 네트워크 통신을 종료합니다.
해당 사이트의 내용을 참고로 작성했습니다. 추후에 더 알게 되는 내용들을 추가하겠습니다.
kxmjhwn tstory
명월 일지
[CS] 그림으로 알아보는 네트워크 - 소켓 프로그래밍과 Handshaking
[운영체제] 소켓
소켓이란 무엇인가?
곰돌이 놀이터