You do not have permission to capture on device "en1". ((cannot open BPF device) /dev/bpf0: Permission denied)
Please check to make sure you have sufficient permissions.
If you installed Wireshark using the package from wireshark.org, close this dialog and click on the "installing ChmodBPF" link in "You can fix this by installing ChmodBPF." on the main screen, and then complete the installation procedure.
터미널에 아래 명령어를 입력해보자.
sudo chown gildong /dev/bpf*
정상적으로 실시간 패킷이 잘 확인된다.
아무튼 이제 다시 돌아오자.
각 패킷이 어디서부터(Source) -> 어디로(Destination) / 어떤 포트를 사용해서 / 패킷을 어느 정도의 길이만큼 주고 받았는지를 확인할 수 있다.
왼쪽 하단에는 각 패킷의 세부 정보가 나와 있는데 세부 정보에 우클릭을 해서 Apply as Column을 클릭하면
해당 세부 정보를 컬럼으로 추가할 수 있다.
패킷 필터링
이 많은 패킷들 중 네트워크 지연 분석을 하려면 어떻게 해야할까?
우선 이 많은 패킷들에 필터를 걸어서 원하는 패킷들만 추출해서 볼 수 있어야 한다.
패킷 필터 방법
패킷 필터 방법은 아래 두 가지가 있다.
1. Capture Filter
패킷 수집할 때 부터 필터를 걸어서, 원하는 패킷만 Capture(수집)하는 방법
이 방법은 처음 수집할 때부터 조건이 적용되기 때문에 성능에 영향을 줄 수 있다.
ex. tcp port 443
2. Display Filter
먼저 전체 패킷을 수집하고 그 이후에 Display 되는 화면에서 필터를 걸어서 보는 방법
패킷 세부 정보를 볼 때 해당 패킷 기준으로 필터를 걸고 싶을 때는 해당 정보에 우클릭 후 Apply as Filter 를 사용하면 된다.
그럼 위쪽의 필터에 자동으로 ip.src==142.250.256.238 조건이 지정되었고
Source Address가 142.250.256.238 인 패킷들만 display 된 것을 확인할 수 있다.
Packet Delay 여부를 분석하기 위해서는 어떻게 해야 할까?
우선 가장 기본이 되는 시간 컬럼을 잘 분석해야 한다.
Req ~ Rep 간에 소요되는 시간이 패킷별로 일정한지, 일정하지 않다면 변화가 생기는 지점을 분석해봐야 한다.
참고로 시간 포맷은 View > Time Display Format 으로 들어가서 선택할 수 있다.
Time Column 종류
Seconds Since First Captured Packet
첫번째 패킷이 캡쳐된 시간을 0으로 지정하고 그 이후의 패킷들은 첫번째 패킷의 시간을 기준으로 비교해서 측정된다.
Seconds Since Previous Captured Packet
이전 패킷을 기준으로 다음 패킷이 수집되기까지 (받거나 보내거나) 걸리는 시간을 보여준다.
아래 예시를 보면 2번 패킷은 1번 패킷이 수집되고 0.003859초만에 왔다.
3번 패킷은 2번 패킷이 수집되고 0.000018초만에 왔다.
4번 패킷은 3번 패킷이 수집되고 0.000001초만에 왔다.
Seconds Since Previous Displayed Packet
화면에 디스플레이 된 패킷들만 대상으로 두고, 이전 패킷을 기준으로 다음 패킷이 수집되기까지(받거나 보내거나) 걸리는 시간을 보여준다.
이 옵션은 필터가 지정되어 있지 않을 때는 위의 Captured Packet 옵션이랑 동일하다.
그러나 필터가 적용되면 아래와 같이 화면에 보여지는 패킷들(조건 지정된 패킷들) 만 대상으로 패킷간에 전달된 시간을 보여준다.
7번과 9번 패킷을 보면 7번 패킷 이후에 9번 패킷이 오기까지 0.048793초가 걸렸다. 이는 위 사진을 보면 7번~8번 패킷 간 걸린 시간인 0.001079초와 8번~9번 패킷 간 걸린 시간인 0.047714초를 더한 시간임을 알 수 있다.
네트워크 지연의 원인
1. 흐름 제어 (Flow Control)
수신 측 처리 속도보다 송신 측 전송 속도가 빠를 때 발생한다.
수신 측의 용량보다 더 빠르게 보내서 패킷이 손실되면(OverFlow), 다시 불필요한 전송과 Ack/Nack 응답을 주고 받아 확인해야하므로 이로 인한 딜레이가 발생할 수 있다.
해결 방법으로는 Stop and Wait와 Sliding Window 가 있다.
1) Stop and Wait
첫번째 Stop and Wait 방식은 매번 잘 받았다고 응답을 보내야 다음 패킷을 보내는 방식이기 때문에 데이터 유실 없이 안정적인 전송이 가능하겠지만 데이터 전송에 시간이 오래 걸릴 수 있다.
2) Sliding Window
두번째 Sliding Window 방식은 받는 쪽에서 정한 데이터 크기(Window Size) 에 해당하는 패킷들을 전부 보내서 각 패킷의 응답이 오지 않아도 여러 패킷을 보낼 수 있다. 각 패킷별로 잘 받았다는 응답이 와야 다음 패킷을 보낼 수 있는 Stop and Wait 보다 훨씬 효율적인 방법이다. 통신 과정 중에 네트워크가 혼잡하다면 윈도우 크기는 유동적으로 바뀔 수 있다.
Sliding Window 방식으로 흐름제어를 하지만 이로 인해 데이터 읽기 속도 저하가 발생할 수 있다. 아래를 보자.
* 흐름제어로 인한 데이터 읽기 속도 저하
TCP header 에는 Window Size가 있다. Window Size값이란 수신자가 받을 수 있는 최대 데이터 크기를 의미한다.
App(수신자)이 네트워크를 통해 전달된 패킷을 받으면 버퍼가 채워지고, App이 데이터를 처리하면(읽으면) 버퍼가 비워진다.
만약 App의 처리 속도가 1분에 10개의 패킷을 처리한다고 했을 때, Sender 쪽에서 그 보다 더 빠른 속도로 패킷을 전송하면 App의 Window가 점점 차게 된다.
그럼 Sender 는 데이터의 일부만 보내거나 아예 보낼 수 없는 상황이 발생하고 서버가 전체적으로 지연되는 것이다.
이런 상황은 어떻게 알 수 있을까?
네트워크에 쓰기 요청을 했는데 그 결과가 0 byte만큼 썼다고 나오면-> Window Size로 인해 서버 지연이 발생하고 있는 상황을 의심해 볼 수 있다.
2. 혼잡 제어(Congestion Control)
혼잡제어도 흐름제어와 동일하게 받는 쪽에서 처리하는 데이터 속도보다 보내는 쪽의 속도가 더 빠를 때의 문제를 해결하기 위한 기법이다. 다른점은 혼잡제어는 흐름제어와 달리 보다 넓게 호스트 및 라우터를 포함한다.
패킷이 거쳐가는 네트워크 경로 상의 장비(라우터, 스위치) 정보와 각 장비의 IP 주소 및 응답 속도를 확인할 수 있다.
이를 활용해 속도 지연이 발생되는 구간을 확인할 수 있다.
속도 지연이 발생되는 구간의 라우팅 경로를 변경하면 문제 해결이 될 수도 있다.
ping 명령어와 같이 icmp로 동작하므로 특정 경로에서 icmp 가 차단되어 있다면 정보를 얻지 못한다. (요청 시간 만료로 표시)
예)
$ tracert 192.168.0.0
$ tracert naver.com
옵션
-d 주소를 호스트 이름으로 확인하지 않습니다.
-h maximum_hops 대상 검색을 위한 최대 홉 수입니다.
-j host-list host-list에 따라 원본 라우팅을 완화합니다(IPv4에만 해당).
-w timeout 각 응답의 대기 시간 제한(밀리초)입니다.
-R 왕복 경로를 추적합니다(IPv6에만 해당).
-S srcaddr 사용할 원본 주소입니다(IPv6에만 해당).
-4 IPv4를 사용합니다.
-6 IPv6을 사용합니다.
[서버 이중화]
안정적으로 무중단 서비스를 제공해야 하는 경우에 서버 두 대를 이용한다. 이를 서버 이중화 구조라고 하는데 크게 Active-Active 구조와 Active-Standby 구조로 나뉜다.