프로토콜 스택에 메시지 송신을 의뢰
1%의 네트워크 원리 (05) - 웹 브라우저가 메시지를 생성 4
04 프로토콜 스택에 메시지 송신을 의뢰
1 데이터 송·수신 동작 개요
소켓
- 파이프 양 끝에 있는 데이터의 출입구
- 서버측에서 소켓 생성
- 소켓에 클라이언트가 파이프를 연결하기를 기다림
- 데이터를 전부 보내고나면 연결했던 파이프 분리
- 분리 순서는 규칙으로 결정됨
애플리케이션 -> Socket 라이브러리 -> 프로토콜 스택
- 소켓 작성
- 서버측 소켓에 파이프 접속
- 데이터 송·수신
- 파이프 분리, 소켓 말소
2 소켓의 작성 단계
socket()
1
2
3
4
5
6
<메모리 영역> = gethostbyname(도메인명); // DNS
<디스크립터> = socket(...); // 준비
connect(...); // 접속
write(...); // 송신
<수신 데이터 길이> = read(...); // 수신
close(...); // 연결 끊기
디스크립터
- 소켓 식별 역할
- 하나하나의 소켓에 할당한 번호같은 것
- 한 대의 컴퓨터에 브라우저의 2개 창을 열어 2개의 웹 서버에 동시에 액세스 등
3 파이프를 연결하는 접속 단계
connect()
IP 주소
- 네트워크에 존재하는 각 컴퓨터를 식별하기 위해 각각에 서로 다른 값을 할당한 것
- 각 기기가 아닌 기기에 장착된 각각의 네트워크용 하드웨어에 할당
- 복수의 네트워크 하드웨어를 장착한 기기에는 복수의 주소 할당
- 네트워크의 어느 컴퓨터까지 지정하기 때문에 IP 주소로는 소켓까지는 지정 불가
디스크립터
- 컴퓨터 한 대의 내부에서 소켓을 식별하기 위해 사용
- 소켓을 만들도록 의뢰한 애플리케이션측에 건넴
- 접속 상대에게 건네지 않음
포트 번호
- 접속 상대측에서 소켓을 식별하기 위해 사용
- 서버측의 포트 번호는 애플리케이션의 종류에 따라 미리 결정된 값을 사용한다는 규칙 존재
- 클라이언트측의 소켓의 포트 번호는 소켓을 만들 때 프로토콜 스택이 적당한 값을 골라 할당
- 이 값을 프로토콜 스택이 접속 동작을 실행할 때 서버측에 통지
4 메시지를 주고 받는 송·수신 단계
write()
, read()
- 애플리케이션
- 메모리
- 송신 데이터(HTTP 리퀘스트 메시지)
write()
로 디스크립터, 송신 데이터 지정
- 프로토콜 스택
- 서버
- 프로토콜 스택
- 수신 버퍼
- 수신 데이터(응답 메시지)
read()
- 애플리케이션
5 연결 끊기 단계에서 송·수신 단계 종료
close()
브라우저가 데이터 수신을 완료하면 송·수신 동작 끝
웹 서버측에서 close()
호출해 연결 끊음
- 클라이언트측에 전달되어 클라이언트의 소켓은 연결 끊기 단계로 진입
- 브라우저가
read()
로 수신 동작 의뢰 read()
는 수신 데이터 전달 대신 송·수신 동작 완료로 연결이 끊겼다는 사실을 통지- 브라우저에서도
close()
호출해 연결 끊기 단계로 진입
메시지를 실제로 송·수신하는 것
- 프로토콜 스택
- LAN 드라이버
- LAN 어댑터
참고
성공과 실패를 결정하는 1%의 네트워크 원리