WireShark HTTP Packet Capture 대해서 알아보자
1. TCP 통신 과정
기본적인 TCP 통신과정을 그림으로 표현하면 아래와 같다.
[연결] - [데이터 통신] - [종료]의 3단계로 진행되며 이제부터는 HTTP 통신을 예제로 하여 해당 과제를 살펴보자.
앞서 각 과정에서 전송되는 패킷의 구조와 Flag들의 의미는 아래와 같다.
- URG(긴급 데이터 표시) : 상위계층에서 긴급 데이터임을 표시한 패킷으로 전송 시 우선적으로 전송됨
- ACK(응답 확인) : 패킷을 정상적으로 수신했다는 것을 알리기 위한 패킷
- PSH(즉시 확인 요청) : 해당 표시가 된 패킷은 수신한 경우 버퍼가 차는 것을 기다리지 않고 즉시 상위 계층으로 전달
- RST(연결 초기화 요청) : TCP 연결상 문제가 발생 시 현재 연결을 끊고 다시 연결할 것을 요청한다.
- SYN(회선 연결 요청) : TCP 연결을 요청하는 패킷이며, 현재 자신의 준비상태를 상대방에게 전달
- FIN(회선 연결 종료) : 모든 데이터 전송이 완료되었음으로 연결을 종료할 것을 알림
2. HTTP Connect - 연결과정
HTTP는 TCP 80번 포트를 이용한다. (HTTPS는 443번)
테스트 사이트 : 통계청사이트(http://kostat.go.kr)
통계청 사이트에 접속할 때 교환되는 패킷 내용
캡처 PC : Youngui_MacBook-Pro
통계청 : 125.60.43.157
처음 3줄을 보면 위와 같이 SYN, SYNACK, ACK로 3 Way Hand Shake가 정상적으로 통신하는 걸 확인할 수 있다.
3 Way Hand Shake
- SYN(클라이언트 → 서버) : 클라이언트가 서버에 TCP 연결을 요청한다. 이때 자신의 연결 준비 상태를 함께 전송한다.
- SYN+ACK(서버 → 클라이언트) : 서버가 클라이언트의 연결 요청에 응답(ACK)하며, 자신의 연결 준비상태를 알린다.(SYN)
- ACK(클라이언트→ 서버) : 클라이언트가 서버의 연결 준비 상태(SYN)를 포함한 패킷을 잘 수신했다고 알린다.(ACK)
3. HTTP Data Transmission - 데이터 통신
여기서는 HTTP 프로토콜을 이용하여 TCP 전송에 대해서 다루기 때문에 전송되는 데이터는 [HTTP 프로토콜]에서 사용하는 메서드와 해당 메서스에 대한 응답 등이 해당된다.
위에 3개의 패킷은 TCP Conncet 이후 최초의 데이터 패킷이다.
각 패킷은 아래와 같은 역할을 한다.
- HTTP (클라이언트 → 서버) : 기본 URL(kostat.go.kr) / (최상위) 위치에 대한 HTML 파일을 요청한다. 즉 kostat.go.kr에 접속했을 때 최초로 보여줄 HTML 파일에 대한 정보를 서버에 요청하는 과정이다.
- HTTP 200 OK (서버 → 클라이언트) : 200번 응답은 정상적으로 요청한 내용을 전송했다는 의미이며, 위에서 요청한 kostat.go.kr/에 접속 시 보여줄 HTML 파일을 전송했다는 의미이다.
- ACK (클라이언트 → 서버) : 서버가 클라이언트에게 전송한 HTML 파일을 정상적으로 수신했다는 ACK 응답이다.
데이터 통신과정에서 ㅂ라생하는 대부분의 통신 내용은 위와 같은 방식을 가지고 있다.
물론 데이터의 크기가 MTU(최대 전송 단위) 이상일 경우 단편화(Fragmentation)를 통해서 데이터를 조각내서 전송하게 된다.
아래는 단편화된 패킷의 예제이다.
kostat.go.kr/portal/kor_nw/1/1/index.board?bmode=read&Seq=376435에 대한 GET 요청에 대해서는 서버는 응답을 여러 개로 나누어서 보내는 것을 볼 수 있다.
이에 따라 클라이언트도 여러 개의 ACK를 생성해 전송하게 된다(PDU = 프로토콜 데이터 유닛)
여기서 전송되는 데이터의 최대 크기가 1514 Byte인 것을 볼 수 있다.
이를 통해 1514 Byte가 일반적인 이더넷 패킷의 MTU가 된다는 것을 알 수 있다.
4. HTTP Disconnect - 연결 종료
위와 같은 전송이 TCP 연결 종료에 해당한다.
하지만 항상 위와 같은 상태는 아닐 수도 있다.
FIN 메시지는 데이터 전송이 완료되었다고 서버가 판단하고 먼저 보낼 수도 있다.
- FIN+ACK(클라이언트 → 서버) : 이전에 서버로부터 받은 데이터를 잘 수신하였으며(ACK), 모든 데이터 전송이 끝났음을 연결 종료를 요청한다.
- FIN+ACK (서버 → 클라이언트) : 서버가 정상적으로 FIN 메시지를 수신하였으며(ACK), 서버는 더 이상 처리할 데이터가 없으므로 마찬가지로 즉시 FIN 메시지를 전송한다.(만약 더 통신할 데이터가 있을 경우 ACK만 전송한 후 데이터 교환 후 FIN 메시지를 보낸다.)
- ACK (클라이언트 → 서버) : 서버의 FIN 메시지를 정상적으로 수신했음을 알린다.
위의 모든 과정이 끝나면 서버와 클라이언트 모두 연결을 위해 할당했던 리소스를 회수한다.
출처
'IT Technology > Network' 카테고리의 다른 글
FWLB(Firewall Load Balancing)이란? (0) | 2021.09.06 |
---|---|
VxLAN 이란? (0) | 2021.08.17 |
네트워크 인라인(In-line), 원암(One-Arm) 구성이란? (0) | 2021.08.02 |
네트워크 장비 내부 구조 (0) | 2021.07.27 |
STP 스패닝 트리 프로토콜 용어 및 규칙 (0) | 2021.07.12 |