💡 해당 포스트는 kocw 이석복 교수님의 컴퓨터 네트워크 강의를 듣고 작성하였습니다.
create->bind->wait for connection->accept
int socket(int domain, int type, int protocol);
domain
: 생성할 socket이 통신을 위해 사용할 프로토콜 체계 설정type
: socket이 사용할 데이터 전송타입 설정(tcp || ucp)protocol
: 두 호스트 간 통신을 위한 특정 포로토콜 지정소켓을 생성하는 함수.
두 번째 파라미터가 중요한데, tcp를 할 지 udp를 할 지 방식을 정한다.
리턴 값: 성공 시 파일 디스크립터, 실패 시 -1
파일 디스크립터 : 운영체제가 특정파일에 할당한 정수값
int bind(int sockfd, struct sockaddr* my addr, int addrlen);
sockfd
: 주소를 할당할 socket의 디스크립터 번호*addr
: 할당하고자 하는 주소 정보(ip, port)를 가지고 있는 serv_addr 구조체addrlen
: 주소정보를 담은 변수의 길이소켓에 포트 번호를 부여하는 함수.
소켓을 특정 프로세스에 bind한다.
리턴 값 : 성공 시 0, 실패 시 -1
int listen (int sockfd, int backlog);
sockfd
: client로부터 연결 요청을 받을 socket 디스크립터 번호 (서버소켓)backlog
: 연결요청을 대기하는 큐의 크기소켓에 연결요청을 대기하는 함수.
두 번째 파라미터를 통해 backlog queue size
를 지정하고 size만큼 que 공간을 갖는다. 모든 연결 요청은 que에 들어가 순서대로 수락을 기다린다.
리턴 값: 성공 시 0, 실패 시 -1
listen
함수가 호출된 이후에 client에서 connect를 호출할 수 있다.
int accept(int sockfd, struct sockaddr* cliaddr, int* addrelent)
sockfd
: 연결을 기다리는 서버 socket 디스크립터 번호addr
: 연결 요청을 수락할 클라이언트의 ip와 port 정보addrlen
: addr 변수의 크기client의 연결 요청을 받아들이는 함수.
accept
함수의 반환값은 성공/실패에 대한 결과정수값이 아니라 새로운 디스크립터 번호다.
리턴 값: 성공 시 새로 생긴 파일 디스크립터, 실패 시 -1
int connect(int sockfc, struct sockaddr *serv_addr, int addrlen)
sockfd
: client 디스크립트 번호addr
: 연결 요청을 보낼 서버 주소 정보를 지닌 구조체addrlen
: addr 변수의 크기클라이언트에서 서버로 연결을 요청하는 함수
리턴 : 연결요청이 서버에 의해 수락되거나 오류가 발생해서 요청이 중단되면 connect
함수가 리턴됨.
블로킹 : 서버 대기 큐에서 대기하는 상태면 리턴되지않고 블로킹.
리턴 값: 성공 시 0, 실패 시 1
데이터 송수신 후, 소켓을 완전히 소멸시키고 연결을 닫는 함수.
transport layer는 출발지부터 도착지까지 패킷이 제대로 전송될 수 있도록 한다.
application layer
에서 packet이 socket을 통해 transport layer로 전달될 때, 패킷을 수집해 하나의 segment로 캡슐화하여 network layer
로 전달
하위레이어로부터 수신된 segment(data + header)를 올바른 socket(app)으로 전송하는 것.
이 때 segment header 정보(destination port)를 보고 올바른 socket으로 전달한다.
udp는 dest ip, dest port 2개로 판단한다.
source ip,port 가 달라도 destination port가 같으면 같은 소켓으로 전달된다. 출처는 고려하지 않는다.
tcp socekt은
source ip / source port /
destination ip / destination port
4-tuple로 식별한다.
웹 서버는 각 연결된 클라이언트마다 서로 다른 socket을 가진다. 자원이 많이 소모된다.
transport layer는 segment에 port저장하고
network layer는 packet에 ip저장한다.
udp,tcp,ip 프로토콜 header가 중요하며, header를 알아야 프로토콜을 이해할 수 있다.
udp header field 4개이며, 한 필드 16bit를 차지한다.
udp가 아무일도 안하는 것 같지만 multiplexing, de-multiplexting, error checking 등 기본적인 3가지 기능은 제공한다.