대상 웹사이트: www.unipune.ac.in
와이어샤크는 네트워크 패킷을 캡쳐하고 분석하는, 패킷 분석 프로그램이다.
주로 네트워크 문제를 조사하거나 원인을 찾기 힘든 네트워크에 대한 트러블을 해결할 때 사용된다.

먼저, cmd 창에서 nslookup 명령어를 통해 www.unipune.ac.in 의 Domain Name에 대한 IP주소를 조회하였다.
nslookup은 Domain name에 해당하는 ip주소를 찾는 등 도메인의 정보를 조회하기 위해 DNS에 질의하는 명령어이다.
kns.kornet.net은 사용자(나)가 연결된 네트워크에서 사용하는 DNS 서버이고, 168.126.63.1은 이 DNS 서버의 IP 주소이다. ‘권한 없는 응답’은 kns.kornet.net가 질의한 도메인에 대해 직접적인 관리 권한이 없지만(해당 도메인을 관리하는 DNS 서버로부터 직접 받은 응답이 아니지만), 캐시 등으로부터 해당 도메인의 IP 주소를 조회하여 응답한 것이다.
이를 통해 받은 www.unipune.ac.in 의 IP 주소는 121.241.73.169이다.
와이어샤크의 Capture Filter를 host 121.241.73.169 || port 53로 설정하여 출발지나 목적지가 121.241.73.168이거나 DNS를 위해 오픈되어있는 port 53에 대한 패킷만 캡처하였다.
Display Filter를 dns로 설정하여 dns request와 response를 확인해보았다.
User Datagram Protocol이라고 되어있어 UDP를 사용하는 것을 알 수 있다.
Src port: 55873, Dst port: 53에서는 messege가 55873번 포트에서 출발하여 DNS에 도달했다는 것을 나타낸다.
Flag에서 Response가 0으로 되어있는 것은 해당 messege는 query임을 나타낸다.
Queries에서 request하고있는 것은 www.unipune.ac.in의 ip주소이다. (DNS에게 request하는 것이다.)
이에 대한 response는 No.5 에서 제시되고있다.
User Datagram Protocol이라고 되어있어 UDP를 사용하는 것을 알 수 있다.
Src port: 53, Dst port: 55873에서는 messege가 DNS로부터 출발하여 55873번 포트에 도달했다는 것을 나타낸다.
Flag에서 Response가 1으로 되어있는 것은 해당 messege는 response임을 나타낸다.
Answers에서 addr 121.241.73.169라고 되어있는 것을 볼 수 있는데, 이는 DNS에 의해 응답받은 www.unipune.ac.in의 ip주소이다. 또한, No.1이 요청한 것임을 확인할 수 있다.
DNS는 기본적으로 UDP 프로토콜을 이용하지만 특수한 상황에서는 TCP를 이용하기도 한다. 해당 분석에서 DNS는 UDP를 사용하였다.
TCP는 연결 지향형 프로토콜이다. 데이터를 전달하기 전에, 두 호스트가 서로 handshake를 하여 논리적인 연결 상태를 수립해야한다. 흔히 두 호스트 사이에 1을 더해 sequence number와 acknowledgment number를 주고받는 3개의 세그먼트가 보내지는 three-way handshake를 사용한다.
먼저 연결 요청하려는 http 웹사이트가 도착지이므로 Dst Port가 80(http 기본 포트)이다.
relative sequence number(와이어샤크에서 분석의 편리성을 위해 제공하는 상대적 번호)는 0, raw sequence number는 390879146(ISN(Initial Sequence Number), 난수로 설정)이다.
Syn flag는 1로 설정되어 Client가 Server에게 TCP 연결을 요청하는 SYN 신호를 보낸다.

http Server에서 Client의 요청을 확인하고(ACK), Server도 Client에게 연결을 요청(SYN)한다.
http 웹사이트에서 출발하므로, Src port는 80이다.
Server도 Client처럼 자신의 임의의 ISN을 생성하여 Client에게 연결을 요청하기 위해 전송한다. 이것이 raw sequence number이며, 1270552441로 설정되었다. Server의 relative sequence number는 0이다.
Acknowledgment Number를 통해 Client의 요청을 확인하는데, 이는 Client로부터 전달받았던 sequence number에 1을 더한 수이다. 그러므로 390879147(= 390879146+1)이 된다. 같은 원리로 relative acknowledgment number은 Client로부터 전달받았던 relative sequence number + 1, 즉 0 + 1 = 1이 된다.
Syn과 Ack를 모두 하므로 Syn flag와 Ack flag가 1로 설정된다.

확인 응답을 보낼 Dst Port는 http port로, 80이다.
이 패킷의 sequence number는 Client가 이전에 Server에게 보냈던 acknowledgment number와 동일하다. 그러므로 raw sequence number는 390879147, relative sequence number는 1이 된다.
이번에는 Acknowledgment Number를 통해 Server의 요청을 확인하는데, 이는 Server로부터 전달받았던 sequence number에 1을 더한 수이다. 그러므로 1270552442(= 1270552441+1)이 된다. 같은 원리로 relative acknowledgment number은 Server로부터 전달받았던 relative sequence number + 1, 즉 0 + 1 = 1이 된다.
Ack flag는 1로 설정되어 Client가 Server에게 TCP 연결을 확인하는 ACK 신호를 보내 최종적으로 TCP connection setup에 성공하게 된다.

No.39 패킷은 Client가 HTTP 프로토콜을 통해 www.unipune.ac.in서버에 GET 요청을 보내 리소스를 요청한다. TCP를 이용하며, Dst Port는 HTTP 기본 포트인 80이다. raw sequence number는 390879147로, 이후에 Server가 이에 대한 응답을 할 경우의 Acknowledgment number는 390879657(=390879147+510(segment payload= 510))이 되어야한다.
TCP flag를 통해 ACK 신호와 빠르게 데이터를 처리하라는 PSH 신호를 보낸다.

Hypertext Transfer Protocol을 보면, Request Method는 Client가 Server로부터 리소스(페이지)를 요청하는 메소드인 GET이 지정되어 있다.
Request URI는 가져오려는 페이지의 파일 위치를 지정하는 것이다.
Request Version은 HTTP의 version으로, 1.1로 지정되어 있다.
Connection으로는 keep-alive가 지정되어 persistent connection을 하려고 한다. (TCP 연결을 유지하려고 한다.)
User-Agent는 Client가 이용하고 있는 OS나 웹브라우저의 종류(환경)를 나타낸다.
Accept는 Client가 Server로부터 받고자 하는 데이터의 형식을 나열한 것이다. 여기서는 text/html, application/xhtml+xml과 같은 형식의 데이터를 받고자 한다.
Accept-Language는 Client가 수신하고자 하는 응답의 언어를 나타낸다. 여기서는 한국어(ko), 영어(en) 등이 요청되었다.
해당 요청에 대한 응답은 No. 51 패킷을 통해 확인할 수 있다.
Src port가 80이고, 아까와 같이 push, acknowledgment flag가 1로 설정되어있다.
Acknowledgment number는 390879657이므로 No. 39에 대한 response라는 것을 알 수 있다.

위의 그림은 HTTP Header field이고, Status Code: 200은 Server가 request를 제대로 처리했다는 뜻이다. 요청한 페이지를 제공했다는 의미이기도 하다.
Cache-control:private은 브라우저같은 특정 사용자 환경에만 캐시된다는 것이다.
Content-Type은 Server가 전송하는 콘텐츠가 HTML 형식임을 나타낸다.

위 그림은 HTTP의 Body field이다. HTTP는 request에 대한 response를 body field에 포함해 전송한다. 이 패킷에서는 HTML 콘텐츠로 되어 있으며, Client에게 보여질 웹 페이지의 내용을 포함한다.
TCP 통신에서 ACK 번호는 패킷의 도착 여부를 확인하기 위해 사용된다. (수신한 패킷의 Sequence number) + (Data size) = (송신할 패킷의 Acknowledgment number)로 Acknowledgment number를 결정할 수 있고, Data Size가 0이라면(TCP three-way handshake 등과 같은 경우) 같은 Acknowledgment number를 반복하는 것을 방지하기 위해 (수신한 패킷의 Sequence number) + 1 을 송신할 패킷의 Acknowledgment number로 사용한다. 또한 송신할 패킷의 Sequence number은 가장 최근에 받은 Acknowledgment number가 된다.
No.39는 Client가 Server에게 request한 패킷이다. Sequence Number는 390879147, Acknowledgment number는 1270552442이다.
No.51은 Server가 Client에게 No.39에 대한 response를 보내는 패킷이다. 앞서 언급했던 공식에서와 동일하게 Acknowledgment number는 390879147 + 510 = 390879657인 것을 확인할 수 있다. 또한 Sequence number는 1270552442로, No.39의 Acknowledgment number와 일치한다.
이번엔 data size가 0인 TCP three-way handshake이다.
Sequence number가 390879146, Acknowledgment number가 0이다. 0인 이유는 최초 연결의 첫 번째 handshake 과정에서는 응답할 요청이 없어 Ack flag의 bit가 0으로 설정되었기 때문이다.
No.6의 요청에 대한 확인이자 Server가 Client에게 연결을 요청하는 No.9를 보면, Acknowledgment number는 390879146 + 1 = 390879147이고, Sequence number는 1270552441이다.
No.9의 요청에 대한 확인인 No.9를 보면, Acknowledgment number는 1270552441 + 1 = 1270552442이고, Sequence number는 390879147로, No.9의 Acknowledgment number와 일치한다.
Non-persistent connection은 각 request/response 쌍이 분리된 TCP connection을 통해 보내지는 것이다. 맺어놓은 TCP connection으로 하나의 object 정보를 가져온다. 여러 object를 전달하거나 받으려면 여러 connection들을 사용해야한다. Server는 response 후에 TCP connection을 닫는다.
이에 비해 Persistent connection은 모든 request와 그에 맞는 respose들을 동일한 TCP connection을 통해 보내지는 것이다. 하나의 TCP connection으로 여러 object들을 전달하거나 받을 수 있다. Server는 response 후에도 TCP connection을 닫지 않는다.
HTTP의 Connection에서 connection의 종류를 알 수 있는데, Connection: close 라면
Non-persistent connection을, Connection: keep-alive라면 Persistent connection을 나타낸다. keep-alive는 HTTP/1.1에서 기본적으로 활성화된 상태이므로 아래와 같은 결과를 확인할 수 있다. 그러므로 Persistent connection이 활성화되어 있다.
