안녕하세요 !
이번에는 패킷에 관해서 글을 작성해보려고 합니다.
바로 글을 써보도록 하겠습니다.
패킷
패킷은 네트워크에서 데이터를 주고 받을 때 사용되는 작은 데이터 단위입니다. 예를 들자면 우리가 웹 사이트를 방문할 때, 브라우저가 서버로부터 웹 페이지를 가져오는 과정에서 여러 패킷이 전송이 됩니다. 여기서는 HTTP 요청 패킷의 간단한 예시를 들어서 설명하겠습니다.
1. HTTP 요청 패킷 예시
브라우저에서 "www.example.com" 에 접속한다고 가정했을때, HTTP GET 요청을 통해서 웹 페이지를 가져옵니다. 이 요청은 담은 패킷의 주요 구성 요소는 다음과 같습니다.
1. 이더넷 헤더 -> 네트워크 인터페이스 간의 통신을 담당하는 부분으로 출발지와 목적지 MAC 주소를 포함한다.
EX)
- 출발지 MAC 주소 : 00:1A:2B:3C:4D:5E
- 목적지 MAC 주소 : 11:22:33:44:55:66
2. IP 헤더 -> 출발지와 목적지 IP 주소를 포함해서 패킷을 라우팅하는 역할을 한다.
EX)
출발지 IP 주소 : 192.168.1.100
목적지 IP 주소 : 93.184.216.34
3. TCP 헤더 : 데이터가 신뢰성 있게 전송되도록 하는 역할을 한다. 출발지 및 목적지 포트 번호가 포함됩니다.
EX)
출발지 포트 : 54321
목적지 포트 : 80 ( HTTP 기본 포트 )
4. HTTP 요청 ( HTTP Request ) : 실제로 웹 서버에 보내는 HTTP GET 요청입니다.
EX)
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
이 패킷은 브라우저에서 웹 서버로 보내져 서버는 이것에 대해서 응답으로 웹 페이지 데이터를 담은 HTTP 응답 패킷을 보내줍니다.
여기서 HTTP 요청 패킷은 클라이언트 ( 주로 웹 브라우저 ) 가 서버에게 웹 페이지나 리소스를 요청할 때 전송하는 데이터 패킷입니다. 이 패킷은 주로 웹에서 사용되고 브라우저가 서버에 요청을 보내기 위한 HTP 프로토콜을 따릅니다. HTTP 요청 패킷은 여러 부분으로 구성이 되어있습니다. 각각의 부분은 서버가 클라이언트의 요청을 정확하게 처리할 수 있도록 도와줍니다.
HTTP 요청 패킷의 주요 구성 요소
1. 요청 줄 ( Request Line )
< HTTP 메서드 > < 요청 URL > < HTTP 버전 >
GET / index.html HTTP/1.1
HTTP 메서드는 클라이언트가 서버에게 무엇읗 하고 싶은지 나타낸다.
대표적인 메서드는 GET, POST 가 나옵니다.
요청 URL : 클라이언트가 요청하는 자원의 경로 입니다. 여기서는 index.html 파일을 요청하는 예시입니다.
HTTP 버전 : HTTP 의 버전 정보를 나타냅니다. 일반적으로 HTTP / 1.1 또는 HTTP/2를 사용합니다.
2. 헤더 ( Header )
요청 줄 다음에는 여러 개의 HTTP 헤더가 나옵니다. 헤더는 클라이언트와 서버 간에 추가적인 정보를 전달하는 역할을 한다. 헤더는 필드 이름과 필드 값으로 이루어져 있습니다. 다양한 정보들을 전달하는 역할을 합니다.
Host: http://www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Host : 서버의 도메인 이름을 나타냅니다. 클라이언트가 어떤 서버에 요청하는지 명시합니다.
User-Agent : 클라이언트가 어떤 브라우저나 장치를 사용하고 있는지에 대한 정보입니다.
Accept : 클라이언트가 받을 수 있는 컨텐츠의 MIME 타입을 정의합니다.
Accept-Language : 클라이언트가 선호하는 언어를 나타냅니다.
Connection : 연결 방식, 보통 keep-alive 로 설정하여 연결을 유지하려고 합니다.
3. 본문 ( Body , 필요 시 )
본문은 HTTP 요청에서 실제 데이터를 담고 있는 부분으로 보통 POST나 PUT 요청 시 사용됩니다. GET 요청에는 본문이 존재하지 않는 경우가 많습니다.
- POST 요청 본문 예시
username=johndoe&password=1234
이 예시는 웹사이트 로그인 양식에서 사용자 이름과 비밀번호를 전송하는 PSOT 요청 본문의 데이터입니다.
요청 줄 : POST /login HTTP/1.1
헤더 : 요청에 필요한 추가 정보를 제공한다.
본문 : username=johndoe&password=1234
2. 각 부분의 역할
1. 이더넷 헤더 : 패킷을 로컬 네트워크에서 다른 장치로 전달하는데 사용된다.
2. IP 헤더 : 인터넷을 통해서 패킷을 목적지 서버까지 전달되는데 사용한다.
3. TCP 헤더 : 데이터가 손실되지 않도록 관리하고 데이터를 적절한 순서로 다시 조립한다.
4. HTTP 요청 : 웹 서버에서 특정 페이지를 요청하는 실제 명령입니다.
이러한 패킷들이 여러 개 조합해서 웹 페이지가 브라우저에서 표시되고 패킷 분석 도구인 와이어 샤크를 통해서 패킷의 세부 정보를 분석할 수 있습니다.
끝