프롤로그
패킷...데이터 덩어리..와이어샤크..
패킷
패킷이란 네트워크에서 데이터를 전송할 때 사용하는 작은 데이터 단위이다. 그러니까 데이터를 보낼 때 해당 데이터를 패킷이라는 단위로 잘개 쪼개서 전송한다는 건데, 데이터를 조각으로 잘개 쪼개고, 그것을 상대한테 보낸다음에, 받은 데이터 조각들을 다시 재조립해서 원래 데이터로 만드는 것이다. 그 데이터 조각 하나하나를 패킷이다.
그럼 왜 패킷으로 나눠서 보낼까?
보통 아스키 코드가 1바이트(8비트)를 사용한다. 근데 Hello만 보내도 40비트(5바이트)를 사용하는건데, 한글문서에 자조서 한 칸 쓰는 것만해도 5000자 넘게 드는데 데이터 크기가 매우매우 크다. 원본 그대로 전송이 되어야하는데, 이거 한 번 큰 파일을 보냈다가, 중간에 잘못보내져서 깨지기라도 한다면, 어디서 망가졌는지 확인이 안 되어서 다시 처음부터 보내줘야할 지도 모른다. 자소서 다 써서 제출했는데, 글자 다 깨져서 궯줵뷁 이렇게 적혀있으면 마음 많이 아프지않을까..
영상으로 보면 더 이해 갈 거다. 보통 영화 하나에 4GB 정도 하는데, 통째로 전부 보냈을 때 하나깨지기만 해도 지지지지직 거릴텐데.
패킷의 역할
그래서 패킷을 사용하는 이유는 다음과 같다.
1. 데이터 전송의 기본 단위
네트워크를 통해 데이터를 효율적이고 안정적으로 전송하기 위해 큰 데이터를 작은 단위로 분할하고, 그 패킷중 일부가 손실되어가 손상되어도, 해당 패킷만 다시 보내주면 되기 때문에 데이터를 복구할 수 있다.
2. 네트워크 자원 최적화
OSI 계층 설명할 때, TCP의 역할이 무엇인가? 에서 혼잡제어, 흐름 제어 역할이 있었다. 상대방이 지금 뇌용량이 얼마인가, 가는 길의 경로에 막히지 않았는가? 이런 것을 확인하는데, 그 경로 상황에 맞춰서 1번 패킷은 A경로로, 2번 패킷은 B경로로 보내주어 효율적으로 사용할 수 있다. 그리고 여러 사용자가 동시에 데이터를 전송할 때 충돌을 줄일 수 있다.
3. 전송 중 오류 복구
패킷 손실이나 오류 발생시, 해당 패킷만 다시 요청해서 데이터를 복구할 수 있다. 1번에서 나온 얘기랑 똑같다.
패킷의 구조
패킷은 헤더(Header)와 데이터(Data 또는 Payload)로 구성되어있다.
HTTP랑 비슷하지 않은가?
헤더에는 메타 정보(출발지, 목적지 주소, 패킷 순서, 프로토콜 정보 등)
데이터에는 실제 전송하려는 데이터 (웹 페이지 내용, 파일, 동영상) 등이 들어있다.
패킷 헤더(Header)
데이터 조각을 패킷이라고 했는데, 그냥 데이터들을 막 쪼개서 보냈을 때 상대방에서 합칠 때 어떤 순서로 저걸 합쳐야할지 알 수가 없으니까 앞부분에 메타데이터로 이건 몇 번째야, 어디서 온 거고, 이 패킷이 마지막이야 등을 알려준다.
패킷이 목적지에 도달하고, 올바르게 재조립될 수 있도록 필요한 정보를 포함하게 되는데,
출발지 주소, 목적지 주소, 패킷 번호, 프로토콜, 오류검출 코드 등이 있다.
어 근데 이 패킷, IP헤더를 뜯어보면
이거랑 비슷하지 않은가? 저번에는 TCP, UDP 헤더 구조만 배웠었는데, IP헤더 구조를 보면 저렇게 생겼다.
총 4바이트씩 5줄 해서 20바이트, 각 줄은 32비트로 이루어져 있는 것이다.
Version, IHL
IPv4 같은 경우에, version 부분은 4가 들어가는 거고, IHL 은 토탈 헤더 길이기 때문에 5가 들어가서 IP 헤더 같은 경우 보통 시작이 45로 시작한다. 저기 보면 Protocol 에 TCP나 UDP가 들어가는 거고 Header CheckSum이 오류 검출 코드이다.
어 비슷하지않나? 패킷 헤더랑 IP헤더가?
이러한 이뉴는 패킷의 기본단위는 IP계층에서 정의 되기 때문이다. 즉 IP계층에서 헤더를 추가한 데이터 단위를 패킷이라고 부르는 것이다. TCP 계층의 데이터 조각은 세그먼트, IP계층에서는 패킷이라고 부른다.
Identicication
위 패킷 헤더 사진에서 2번째를 보면 Identicifation이 보인다. 쪼개서 보냈다고 가정했을 떄, 받는 쪽에서는 쪼갠것을 다시 붙여야 하는데, 그 쪼갠것을 fragment라고 한다. A, B, C 패킷을 전송받았는데, Identicifation이 일치한다? 그러면 A, B, C는 같은 데이터에서 쪼개진 fragment라는 것이다. 3개의 프래그먼트가 같은 애들이구나... 그렇다면 저게 같은 곳에서 나왔다는 거니까 저거의 순서만 알면 이어 붙일 수 있는 것이다.
TTL(Time to Live)
패킷이 네트워크에서 살아남을 수 있는 최대 홉(Hop)이다. 수가 0이되면 패킷은 폐기된다. 이게 왜있느냐?
서울에서 부산까지 간다고 했을 떄 서울 -> 대전 -> 대구 -> 부산으로 갈 수도 있고, 서울 -> 인천 -> 강원 -> 대전 -> 청주->부산 이런식으로 갈 수가 있다. 각 칸을 넘을 때마다 이거를 한 홉을 넘었다고 하는데, 이게 잘못해서 서울 ->인천->강원->서울 이렇게 뺑뻉이 돌게 될 수도 있다. 이런 패킷들이 많아지게 된다면 도로가 터지는 건데, 그래서 특정 수 이상으로 패킷이 지나갔으면 폐기 시켜버리는 것이다.
Protocol
상위 계층의 프로토콜 정보이다. TCP같은 경우 06이라고 적혀있고, UDP인 경우에는 17이라고 적혀있다.
헤더 체크섬
IP헤더의 무결성을 확인하기 위한 오류 검출 코드이다.
Source Address, Destination Address
출발 IP주소, 도착 IP 주소. 이건 알지?
flag
이것은 이 IP 패킷이 분할(프래그먼트)가 되었는지 나타내는 것이다. 3비트로 이루어져있는데
첫 번째 비트는 일단 항상 0.
두 번째 비트는 DF(Don't Fragment)를 의미한다. 그래서 만약에 분할되지 않았다면 1로 설정이 되어있고, 분할이 되어있다면 1로 되어있다.
마지막 세 번째 비트는 MF(More Fragments)인데, 1이면 뒤에 패킷이 아직 더 있다, 0이면 뒤에 패킷이 없는 마지막 패킷이라는 의미이다.
그래서 flag 값이 010 이다? 분할되지 않았다 라는 의미이다. 011이 있을 수가 있는가? 이건 불가능하다. 왜냐? DF가 1이라서 분할되지 않아서 이 것은 하나의 프래그먼트로 이루어진 패킷인데, 뒤에 더 있을 수가 없지 않는가?
000이면 분할된 패킷이 전부 보내졌고, 이게 마지막 패킷이라는 의미이고, 001이면? 아직 뒤에 패킷이 더 있다라는 얘기이다.
Fragment Offset
이게 이제 진짜 순서를 나타낸다. 각 데이터의 시작 위치를 나타내는 필드인데,
예시를 들자면
첫 번째 패킷의 시작 위치가 1이고, 크기가 100이라면, 다음 패킷은 101로 시작한 애가 다음 패킷이 될 것이다. 두 번째 패킷의 크기가 200이었다면, 세 번째 패킷의 시작위치는 301일 것이다.
이렇게 시작위치를 알려주고 얘는 13비트 크기로 구성되어있다.
그리고 오프셋은 단위가 8바이트 단위이기 때문에, Fragment Offset = 데이터 시작위치 / 8을 해주어야 한다.
Wireshark
와이어샤크란, 네트워크 트래픽을 캡처하고 분석하는데 사용되는 패킷 분석 도구이다. 무료다. 이미 기존에 깔려있기에 설치방법은 건너뛰겠다.
와이어샤크를 실행하면
이런 화면이 보인다.
IP패킷 하나 캡쳐해서 보면 오른쪽 아래 화면에
패킷의 내용이고 왼쪽에 있는 부분이 사람이 보기 쉽게 해주는 것이다.
패킷을 분석해보면
이렇게 분석이 가능하다.
'KnockOn' 카테고리의 다른 글
[1주차 TIL] KnockOn Bootcamp HTML, CSS, JS (0) | 2024.12.09 |
---|---|
[1주차 TIL] KnockOn Bootcamp 프록시 (1) | 2024.12.07 |
[1주차 TIL] KnockOn Bootcamp 쿠키와 세션 (0) | 2024.12.05 |
[1주차 TIL] KnockOn Bootcamp HTTP/HTTPS (2) | 2024.12.04 |
[1주차 TIL] KnockOn Bootcamp 프로토콜, OSI, TCP, UDP (0) | 2024.12.03 |