Socket은 transport layer가 상위 layer들과 서로 커뮤니케이션할 수 있도록 해주는 구멍으로 비유할 수 있다.
application이 socket을 열고 socket에게 정보를 주면, 그 정보가 상대방 컴퓨터의 application까지 전달될 수 있고, 반대로 상대방 컴퓨터의 application으로부터 socket을 통해 정보를 받을 수 있다. - bidirectional communication
Socket을 통해서 두 컴퓨터들끼리, 또는 한 컴퓨터 내의 두 프로그램들끼리 정보를 주고 받을 수 있다.
Socket server : socket을 통해 정보를 요청 받는 쪽 (요청을 듣는 쪽). 예) 웹 서버, 이메일 서버
Socket client : socket을 통해 정보를 요청하는 쪽. 예) 웹 브라우저, 이메일 앱
Socket API는 inter-process communication(IPC)를 위해서 사용된다
1983년 4.2BSD Unix OS에서 사용되도록 만든 api이다.
POSIX(개방형 컴퓨터 표준)에 따라 진화되었다(Unix, Linux 위에서도 돌아갈 수 있도록 수정됨)
socket() : socket api로 통신하기 위해 가장 처음 호출해야하는 함수로, 특정 숫자(포트 넘버 등)로 구별할 수 있는 소켓을 만들고, 시스템 자원을 할당한다.
bind() : 통신하고자 하는 컴퓨터의 IP 주소와 포트 넘버를 포함해서 socket을 통해 통신할 것이라고 운영체제에 알려 socket과 운영체제를 연결한다.
listen() : 서버에서 사용되는 함수로, UDP에서는 사용되지 않고 TCP에서만 사용되며 서버가 클라이언트의 요청을 듣는 함수이다.
connect() : 클라이언트에서 사용되는 함수로, UDP에서는 사용되지 않고 TCP에서만 사용되며 클라이언트가 서버에게 연결을 요청하는 함수이다.
accept() : 서버에서 사용되는 함수로, 서버가 클라이언트의 요청을 수락할 때 사용하는 함수이다. 기존의 socket은 상대방을 지정하지 않고 단순히 통신을 하기 위해 만들어진 것이라면, 요청을 수락하면 상대방과의 통신을 위해 새로운 TCP 연결을 만들고, 상대방의 정보와 자신의 정보를 합친 새로운 socket을 만든다.(socket address pair를 가짐)
send(), recv(), sendto(), recvfrom() : 양방향 통신에 사용되는 함수로, 데이터를 주고 받을 때 사용된다.
write(), read() : socket을 파일로 규정해서 읽고 쓴다는 의미로 사용되는 함수이다.
close() : TCP 연결을 해제하는 함수이다.
setsockopt() : 특정 socket의 옵션을 설정할 때 사용되는 함수이다.
getsockopt() : 특정 socket의 옵션을 확인하고 싶을 때 사용되는 함수이다.
gethostbyname(), gethostbyaddr() : 호스트의 도메인 이름과 IP 주소를 확인하고 싶을 때 사용되는 함수이다.
(UDP는 connectionless하기 때문에 TCP와 달리 listen, accept, close 과정이 없다.)
=> Multi-threading / multi-process 기능을 통해 비동기식 socket 서버를 개발할 수 있다.