TINY 서버 구현의 흐름

letsbebrave·2022년 5월 17일
0

C

목록 보기
7/7

TINY 웹 서버

TINY main(int argc, char **argv)

매개변수

argc : 메인 함수에 전달 되는 데이터의 수
argv : 클라이언트가 연결하고 싶은 port 넘버

하는 일

  • 반복실행 "서버"로 명령줄에서 넘겨받은(클라이언트가 요청한) port 번호로의 연결 요청을 들음
  • 연결 요청을 받을 준비가 된 듣기 식별자를 생성함
 /* 해당 포트 번호에 해당하는 듣기 소켓 식별자를 열어줌 */
  listenfd = Open_listenfd(argv[1]); 
  • 서버가 클라이언트의 연결 요청을 수락하고 클라이언트와 서버 사이에 성립된 연결의 끝점인 연결 식별자를 생성함
    (연결식별자는 클라이언트와 서버 사이에 연결된 통로라고 생각해주면 편함. 따라서 connectfd를 통해 클라이언트의 파일에 접근할 수 있음.)
connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen);
  • doit 함수를 실행
doit(connfd); 
  • 서버 연결 식별자를 닫아줌
    하나의 프로세스에서 너무 많은 파일을 열게 되면 시스템 자원을 낭비하게 되므로 사용하지 않는 파일은 닫아주는 것이 좋음. 프로세스가 종료되면 파일은 자동으로 닫히므로 프로세스 전반적으로 이용하는 파일의 경우엔 수동으로 닫아주지 않아도 됨.
Close(connfd);
  • 클라이언트의 요청이 올 때마다 새로 연결

한 개의 HTTP 트랜잭션을 수행

void doit (int fd)

매개변수

fd : 연결식별자
연결식별자는 클라이언트와 서버 사이에 연결된 통로라고 생각해주면 편함. 따라서 connectfd를 통해 클라이언트의 파일에 접근할 수 있음.

하는 일

한 번의 HTTP 트랜잭션을 수행하기 위해, 클라이언트의 HTTP 요청 라인을 확인해 정적, 동적 컨텐츠인지를 구분하고 각각의 서버에 보낸다.

HTTP 트랜잭션

HTTP 트랜잭션이란 클라이언트가 웹 서버와 리소스를 주고받기 위해 요청 명령과 응답 결과를 주고 받는 것을 의미한다.

이때, 클라이언트가 보낸 요청 메시지의 첫번째 줄엔
GET / HTTP/1.1과 같은 요청 라인이 있는데, 이 한 줄에 클라이언트가 원하는 모든 요청 정보(method URI version)들이 들어가 있다.

메소드를 통해 서버에게 어떤 동작이 취해져야 하는지를 말해준다 (ex) 웹페이지 가져오기, 정보 수정하기, 파일 삭제하기 등. URI에는 클라이언트가 요청하는 파일 이름과 인자들을 가진다. version 필드는 요청이 준수하는 HTTP 버전을 나타낸다.

cf. HTTP와 HTTP 트랜잭션, 메시지, TCP/IP와의 차이점에 대해 다룬 좋은 자료
https://velog.io/@syoung125/개념공부-HTTP란HTTP-트랜잭션-메시지-TCPIP와의-차이점

port 번호는 어디서 들어가나?

사용자가 GET / HTTP/1.0을 입력해주면 그게 서버에 요청하는 메소드, filename, version을 담고 있음
그럼 main 함수가 실행될 때 있는 port 번호는 어디서 생기나?
Q. 실제 프로세스에서 연결될 수 있는 port 번호는 어디에서 생기는지 궁금.

tiny를 실행할 때 port 번호를 같이 담아서 실행하는데, 이 포트 번호로 먼저 클라이언트로부터 연결 요청 승낙 가능 상태로 만들어준다. -> listenfd 생성
그 다음에 클라이언트한테 GET / HTTP/1.0 요청이 왔으면 while(1)문이 돌면서 클라이언트한테 받은 연결 요청을 Accept해주고 서버와 클라이언트가 연결된다.
이때 connfd에는 클라이언트가 보낸 요청 라인인 GET / HTTP/1.0이 담겨 있을 뿐만 아니라 사용자의 ip 정보나 기타 정보같은 것들이 담겨있다.

이것을 가지고 doit()에서 HTTP 트랜잭션을 해서 서버로 보내기 전에, request headers에 필요한 정보값들을 가지고 request headers를 형식에 맞게 보내준다. (filename 필요)

만약 브라우저에서 해당 페이지를 요청했으면, 알아서 Request Headers에 해당하는 내용들을 서버로 전송한다.
Q.
브라우저로 전송했을 시, 이걸로 요청 라인 제외한 요청 헤더 내용 읽어주는 것?
read_requesthdrs(&rio);


브라우저 접속 시
브라우저에서 알아서 요청하는 정보를 담은 Request Headers 만들어서 보내주고, 객체별로 요청을 해서 메시지 덩어리를 만들어주는 것을 볼 수 있음.

Q2.
clientaddr은 초기화 해준 적이 없는데, 어디서 초기화된 것?

profile
그게, 할 수 있다고 믿어야 해

0개의 댓글