IP 주소를 조사했으면 IP 주소의 상대, 액세스 대상 웹 서버에 메시지를 송신하도록 OS의 내부에 있는 프로토콜 스택에 의뢰함
디지털 데이터(HTTP 메시지)를 송수신 하는 동작은 브라우저 뿐 아니라 네트워크 애플리케이션 전체에 공통
데이터 송수신 동작의 전체 모습

- 데이터를 송수신하는 컴퓨터 사이에 데이터의 통로 같은 것이 있고, 이것을 통해 데이터가 흐르면서 상대측에 도착. 통로는 파이프와 같은 것
- 데이터는 어느 쪽에서 쏟아부어도 상관없고 양방향으로 데이터를 흘릴 수 있음
- 중요한점 : 송수신 동작을 하기 전에 송 수신하는 양자 사이를 파이프로 연결하는 동작이 필요함!
- 파이프의 양 끝에 있는 데이터의 출입구 → 소켓
- 서버 측에서 소켓을 만들고, 소켓에 클라이언트가 파이프를 연결하기를 기다림
- 서버측이 기다리고 있는 동안 클라이언트 측에서 소켓을 만들고, 파이프를 늘려 서버측의 소켓에 연결 → 송수신 동작 실행
데이터 송수신 동작 단계
아래 단계들을 실행하는 것은 OS 내부의 프로토콜 스택에서 진행됨. 브라우저 등의 네트워크 애플리케이션이 Socket 라이브러리를 이용하여 함수를 실행하면 내부적으로는 OS 내부의 프로토콜 스택이 해당 기능을 실행하게 됨
1. 소켓을 만듦 ( 소켓 작성 단계 ) : socket
- 소켓이 생기면 디스크립터 라는 것이 돌아옴
- 디스크립터 : 소켓을 식별하기 위해 사용하는 것
- 컴퓨터의 내부에서는 복수의 데이터 송,수신 동작이 동시에 진행됨(브라우저에 2개의 창을 열었을 때)
- 이 경우 2개의 웹 서버에 동시에 액세스하게 되는데 2개의 소켓이 만들어지게 되고, 하나하나의 소켓을 식별하기 위해 할당한 번호인 것임
- 디스크립터를 보여주면 프로토콜 스택이 어떤 소켓을 사용하여 접속할지, 데이터 송수신할 지를 금방 판단할 수 있음
- 소켓에는 통신 동작을 제어하기 위한 여러 가지 제어 정보가 기록되어 있음. 데이터 송.수신의 진행상황도 기록
2. 서버측의 소켓에 파이프를 연결 ( 접속 단계 ) : connect
- 파라미터 : 디스크립터, 서버의 IP 주소, 포트 번호
- IP 주소는 네트워크에 존재하는 컴퓨터를 식별할 수 있음. 그러나 IP 주소로는 소켓까지 지정할 수가 없기에 이 때 사용되는 것이 포트번호 ( 소켓 식별)
디스크립터 : 애플리케이션이 소켓을 식별하는 것 IP 주소와 포트 번호 : 클라이언트와 서버 간에 상대의 소켓을 식별하는 것
- 클라이언트 측의 포트번호는 프로토콜 스택이 적당한 값을 골라서 할당함
3. 데이터를 송 수신 함( 송, 수신 단계 ) : write, read
- 애플리케이션은 송신 데이터를 메모리에 준비함 ( 사용자가 입력한 URL을 바탕으로 만든 HTTP의 리퀘스트 메시지 )
- write를 호출 ( 디스크립터, 송신 데이터 넘김) : 프로토콜 스택이 디스크립터를 통해, 연결된 상대 소켓을 알 수 있고 그곳을 향해 데이터 송신
- 메시지가 돌아오면 read 호출 : 수신한 응답 메시지를 저장하기 위한 메모리 영역(수신 버퍼, 애플리케이션 프로그램 내부에 마련된 메모리 영역)에 저장함
4. 파이프를 분리하고 소켓을 말소( 연결 끊기 단계 ) : close
- 데이터 수신 완료 후 연결 끊기 단계. 소켓 사이를 연결한 파이프와 같은 것이 분리되고 소켓도 말소됨
- 웹에서 사용하는 HTTP 프로토콜에서는 본래 응답 메시지 송신 완료 후,
- 웹 서버측에서 연결 끊기 동작을 실행. 웹 서버측에서 close 호출
- 그리고 브라우저가 read로 수신 동작 의뢰했을 때, read는 수신한 데이터를 건네주는 대신 송,수신 동작이 완료되어 연결이 끊겼다는 사실을 브라우저에 통지함.
- 송,수신 종료되었다는 것을 알 수 있으므로 브라우저에서도 close를 호출하여 연결 끊기 단계에 들어감
- 위가 HTTP의 본래 동작. 그러나 같은 서버에서 복수의 데이터를 읽을 때 접속과 연결 끊기를 반복하는 것이 비효율적이므로 한 번 접속한 후 연결을 끊지 않고 복수의 리퀘스트와 응답 주고받기를 실행하는 방법 → HTTP 1.1버전부터 이 방법 사용 가능함
