WEB

Packet Tracer를 통한 TCP, HTTP 분석

민철킹 2021. 10. 31. 20:34

TCP 와 HTTP

HTTP 완벽 가이드라는 책을 읽으며 프로젝트를 함께 진행하는 팀원들과 스터디를 진행하고 있다.

 

진행을 하며 팀원분이 직접 패킷을 까보며 진행하면 더 좋을 것 같다는 방향성을 제시해주셨고, 최종적으로 Cisco Packet Tracer를 사용하기로 하였다.

 

4장. 커넥션 관리라는 주제에 대한 발표를 맡게되어 Cisco Packet Tracer를 사용해 직접 흐름을 보며 패킷을 까보았던 경험이 정말 좋은 경험이었기에 글로 남기려한다.

책 내용 정리한 발표자료

 

GitHub - MinChul-Son/Book-for-Developer: 개발 관련 도서를 읽고 기록하는 Repository입니다.📚📚

개발 관련 도서를 읽고 기록하는 Repository입니다.📚📚. Contribute to MinChul-Son/Book-for-Developer development by creating an account on GitHub.

github.com

해당 글에서는 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

 

 

각 단계에 따른 패킷을 직접 분석해보자.

네트워크는 ClientSwitchDHCP ServerDNS ServerWeb Server로 구성되어있다.

  • Client의 ip주소 : 192.168.100.1
  • DNS Server의 ip주소 : 192.168.100.254
  • Web Server의 ip주소 : 192.168.100.253

1. DNS

클라이언트가 브라우저에 입력한 도메인으로부터 서버의 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주소이다.
이제 클라이언트는 서버의 ip주소와 포트번호를 알아냈다.


2. TCP Connection(3-Way HandShake)

요청을 전송할 목적지를 알아냈으므로 이제는 요청을 전달할 경로를 만들어야한다.

 

이 경로는 바로 TCP Connection이다.(세부 설명은 여기서 다루지 않는다.)

 

TCP Connection을 맺기 위해서는 3-Way Handshake가 일어나는데 아래에서 살펴볼 과정이 바로 그것이다.

  • 클라이언트에서 서버로 SYN 전달
  • 서버에서 클라이언트로 ACK + SYN 전달
  • 클라이언트에서 서버로 ACK 전달



클라이언트가 서버와 TCP Connection을 맺고 싶다는 요청인 SYN패킷을 전송한다.

 

 

서버가 클라이언트에게 TCP Connection을 맺고 싶다는 요청인 SYN 패킷과, 클라이언트의 SYN을 잘 받았다는 ACK패킷을 함께 전송한다.

 

클라이언트가 서버에게 TCP Connection 요청이 받아들여졌다는 ACK패킷을 전송한다.

 

여기까지의 과정을 통해 현재 클라이언트와 서버는 TCP Connection을 생성한 상태이다.

 


3. HTTP Transaction

HTTP Request와 HTTP Response로 이루어진 한 싸이클을 HTTP Transaction이라고 부른다.

앞선 2번을 통해 클라이언트와 서버는 HTTP Transaction을 위한 사전 작업인 TCP Connection을 생성하였다.

 

클라이언트가 서버에게 HTTP Request를 전송한다.

 

  • Connection: close를 통해 지속 커넥션을 사용하지 않고 HTTP Transaction 이후 커넥션을 종료할 것임을 명시

서버가 클라이언트에게 HTTP Response를 전송한다.

 

  • Connection을 종료될 것임을 알려주고, Content-Length를 통해 본문의 길이와 Content-Type을 통해 본문의 타입에 대한 정보를 알려준다. 이렇게 클라이언트에게 HTTP Response가 반환되게되고 클라이언트가 원하는 데이터가 브라우저를 통해 화면에 띄워진다.

 

HTTP Transaction 성공적으로 완료되었고, 이제 Connection: close로 인한 TCP Connection 종료가 진행된다.

 

 


4. TCP Close

TCP Connection 생성과는 달리 종료시에는 4-Way Handshake가 수행된다.

  • 클라이언트가 FIN 패킷을 서버로 전송한다.
  • 서버는 커넥션을 종료하고 확인 응답인 ACK 패킷을 클라이언트로 전송한다.
  • 서버는 FIN 패킷을 클라이언트로 전송한다.
  • 클라이언트는 커넥션을 종료하고 확인 응답인 ACK 패킷을 클라이언트로 전송한다.

 

클라이언트가 FIN 패킷을 서버로 전송한다.

서버가 ACK패킷을 클라이언트에게 전송한다.

서버가 FIN 패킷을 클라이언트에게 전송한다.

클라이언트가 ACK패킷을 서버에게 전송한다.

 


우리가 무심코 사용하는 HTTP 통신을 위해서는 이렇게 수많은 과정이 숨어있다.

반응형