Socket
Socket은 둘 사이의 연결을 위한 연결부라는 의미를 가진다.
특히 전자기기의 연결에서 많이 사용된다.
네트워크 분야에서 소켓 또한 비슷한 의미를 가진다.
소켓은 네트워크를 통해 데이터가 이동할 수 있도록 만들어진 연결부 라고 말할 수 있다.
소켓은 규격이 맞는 연결부에만 연결 할 수 있다.
네트워크에서의 소켓 또한 그에 맞는 규격이 존재한다.
이 규격을 Protocol이라고 하며,
소켓을 통한 통신을 위해서는 소켓이 Protocol을 지키며 제작되어야 한다.
Client와 Server 사이의 소켓 통신에 대해 알아보도록 하자.
Client와 Server가 소켓을 이용하여 통신하기 위해서 Protocol(규격)을 지켜야 하는데,
이 역할을 하는 것이 Port 번호이다.
지정된 Port 번호를 사용하면 소켓 통신을 위한 통로가 연결이 되고,
잘못된 Port 번호를 사용하면 연결을 거부한다.
222.222.222.222 를 IP 주소로 가정하자.
1) Client -> Server
Client가 Server에 연결하기 위해 222.222.222.222의 주소로 연결을 시도한다.
이 때, 소켓 통신을 위한 Port 번호로 8000을 사용한다.
222.222.222.222 : 8000 의 형태이다.
2) Client <- Server
연결을 시도한 Client가 입력한 Port 번호가 올바른지 파악하여 연결을 결정한다.
만약, Client가 8000이 아닌 다른 Port 번호, 7000을 사용했다면
Server는 이 연결을 무시하고 Client <-> Server의 연결 통로는 만들어지지 않는다.
3) Client <-> Server
Client가 올바른 Port 번텍스트호를 사용했다면, Server와 Client 사이의 소켓을 통한
통로가 생성되게 된다.
이를 이용하여 Client와 Server는 데이터 통신을 주고 받을 수 있다.
Client와 Server의 소켓 통신이 이루어지는 과정

Socket : Client와 Server의 Socket을 생성한다.
Setsockopt, Bind : Server는 Socket의 Option을 만들고, 서버의 주소와 Bind한다.
Connect : Client가 소켓을 통해 Connect(연결)를 시도한다.
Listen : Server는 Client의 연결 시도를 받아 이를 확인한다.
Accept : Client가 지정된 Port 번호를 사용하여 올바른 연결을 시도했다면,
Server는 해당 연결을 허용한다.
만약 잘못된 Port 번호를 사용했다면, 해당 연결을 무시한다.
Send/Recv : Client와 Server가 연결된 통로를 이용하여 데이터를 교환한다.
Close : 데이터의 송수신이 필요 없어지면, Socket 연결 통로를 닫고 연결을 중지한다.
그림에는 표현되어있지 않지만, Socket 연결 이후 연결을 끊는 것도 중요하다.