HTTP 완벽 가이드
라는 책을 읽으며 프로젝트를 함께 진행하는 팀원들과 스터디를 진행하고 있다.
진행을 하며 팀원분이 직접 패킷을 까보며 진행하면 더 좋을 것 같다는 방향성을 제시해주셨고, 최종적으로 Cisco Packet Tracer
를 사용하기로 하였다.
4장. 커넥션 관리
라는 주제에 대한 발표를 맡게되어 Cisco Packet Tracer
를 사용해 직접 흐름을 보며 패킷을 까보았던 경험이 정말 좋은 경험이었기에 글로 남기려한다.
해당 글에서는 Cisco Packet Tracer
를 통한 분석만을 작성할 예정이므로 자세한 내용은 위 글을 참조하자.
우리가 www.naver.com
이라는 url
을 브라우저에 입력할 때 어떤 일이 일어나는 지에 대해 생각해본적이 있는가?
www.naver.com
이라는 도메인 주소를 사용하는 서버의ip
주소를 알아내기 위해DNS
서버에게 물어본다.- 1번의 과정으로 알아낸 서버의 주소와 포트를 지정하지 않았다면
well known
포트를 통해 서버에 접근한다. ==>http는 80, https는 443
- 즉,
https://www.naver.com
와https://www.naver.com:443
은 같다.
- 즉,
- 클라이언트와 서버가
TCP Connection
을 맺는다. - HTTP 통신을 한다.(클라이언트의 요청, 서버의 응답)
- TCP 커넥션을 종료한다.(지속 커넥션이라면 종료 안함)
매우 간단해 보이는 HTTP 트랜잭션
한 과정에서 위와 같은 매우 많은 통신이 일어난다.
각설하고, Packet Tracer
를 통해 직접 살펴보자.
아래는 웹 브라우저를 통해 ark-inflearn.com
이라는 도메인 주소로 접속했을 때의 전체 흐름이다.(사전에 DNS서버에 서버 ip 주소를 ark-inflearn.com
이라는 도메인으로 등록해둠)
위에서 언급된 과정과 동일한 흐름으로 진행되는 것을 확인할 수 있다.
- ip 주소 추출
- 추출된 ip주소와 포트 번호를 통해
TCP Connection
생성 ==>3-Way Handshake
- 클라이언트에서 서버로
HTTP Request
전송 - 서버에서 클라이언트로
HTTP Response
전송 TCP Connection
종료 ==>4-Way Handshake
각 단계에 따른 패킷을 직접 분석해보자.
네트워크는 Client
, Switch
, DHCP Server
, DNS Server
, Web Server
로 구성되어있다.
Client
의 ip주소 :192.168.100.1
DNS Server
의 ip주소 :192.168.100.254
Web Server
의 ip주소 :192.168.100.253
클라이언트가 브라우저에 입력한 도메인으로부터 서버의 ip
를 추출해내는 과정이다.
DNS Server
에 등록된 도메인인지? 등록되었다면 ip
주소가 무엇인지를 물어본다.
UDP
프로토콜을 사용하고,Source
(발신지)는Client
주소이고,Destination
(수신지)는DNS Server
인 것을 확인할 수 있다.- 패킷 내부를 보면
DNS Query
를 통해 해당 호스트명을 사용하는 서버의ip
주소를 질의하고 있다.
이것이 Switch
를 통해 DNS Server
에 전달된다. 그 후, DNS Server
는 해당 호스트명에 해당하는 서버의 ip
주소를 담아 다시 Client
에게 전송한다.
- In Layers : 요청
- Out Layers : 응답
DNS Server
의 응답을 살펴보자.
위에서 확인할 수 있듯이 Source
는 DNS Server
, Destination
은 Client
이다.
DNS Query
에 대한DNS Answer
를 확인하면ark-inflearn.com
이라는 도메인을 사용하는 서버의ip
주소는192.168.100.253
이라고 응답하고 있다.- 이는
Client
가 접근하길 원하는 서버의ip
주소이다.
요청을 전송할 목적지를 알아냈으므로 이제는 요청을 전달할 경로를 만들어야한다.
이 경로는 바로 TCP Connection
이다.(세부 설명은 여기서 다루지 않는다.)
TCP Connection
을 맺기 위해서는 3-Way Handshake
가 일어나는데 아래에서 살펴볼 과정이 바로 그것이다.
- 클라이언트에서 서버로
SYN
전달 - 서버에서 클라이언트로
ACK
+SYN
전달 - 클라이언트에서 서버로
ACK
전달
HTTP Request
와 HTTP Response
로 이루어진 한 싸이클을 HTTP Transaction
이라고 부른다.
앞선 2번을 통해 클라이언트와 서버는 HTTP Transaction
을 위한 사전 작업인 TCP Connection
을 생성하였다.
Connection: close
를 통해 지속 커넥션을 사용하지 않고HTTP Transaction
이후 커넥션을 종료할 것임을 명시함
Connection
을 종료될 것임을 알려주고,Content-Length
를 통해 본문의 길이와Content-Type
을 통해 본문의 타입에 대한 정보를 알려준다. 이렇게 클라이언트에게HTTP Response
가 반환되게되고 클라이언트가 원하는 데이터가 브라우저를 통해 화면에 띄워진다.
TCP Connection
생성과는 달리 종료시에는 4-Way Handshake
가 수행된다.
- 클라이언트가
FIN
패킷을 서버로 전송한다. - 서버는 커넥션을 종료하고 확인 응답인
ACK
패킷을 클라이언트로 전송한다. - 서버는
FIN
패킷을 클라이언트로 전송한다. - 클라이언트는 커넥션을 종료하고 확인 응답인
ACK
패킷을 클라이언트로 전송한다.
우리가 무심코 사용하는 HTTP
통신을 위해서는 이렇게 수많은 과정이 숨어있다.