레이블이 tcp인 게시물을 표시합니다. 모든 게시물 표시
레이블이 tcp인 게시물을 표시합니다. 모든 게시물 표시

wsgidav(webdav) session hang

# k8s ingress > webdav(https://github.com/mar10/wsgidav) pod 환경으로 사용 중 수천개의 파일을 업로그 하는경우 같이 다수의 요청이 발생하면 hangup(응답없음) 현상이 발생한다.

# webdav 테스트이미지(htop, netstat 등 추가)를 새로 만들고 적용해서 모니터링해보자.
# webdav 설정 thread=10 개라 10개의 파이썬 프로세스에서 10개의 tcp session 까지 처리할 수 있는 상태다.
# 도메인으로 요청시 세션(tcp ESTABLISHED)이 늘어났지만 세션 종료는 안돼 새 연결 요청을 받지 못하는것으로 보인다.

# webdav 용 클라이언트 코드에 ysoftman_test:8080 로 하드코딩하고 /etc/host 에 아래와 같이 호스트를 추가하고
10.10.10.10  ysoftman_test

# 아래와 같이 요청을 계속 날리고 webdav 서버 container netstat -nat 로 보면 세션이 늘어나지 않고 잘 처리됐다.
watch -n 0.1 "httpstat http://ysoftamn:abc123@ysoftman_test"

# 위와 같이 ingress(Ingress NGINX Controller)를 경유하지 않으면 된다.
# 그럼 nginx controller 에서 뭔 keepalive 와 같은 일정 시간 연결을 유지하는것 때문이지 않을까?
# controller 의 confimap 에 keepalive 를 사용하지 않도록 하는 설정이 있다.
# ingress nginx controller configmap > data 에 다음 설정을 추가하면 세션 keepalive 를 사용하지 않는다.(요청 완료된 세션 종료)
# 하지만 configmap 설정이라 ingress 를 사용하는 모드 서비스에 영향을 주어 테스트만하고 실제 적용은 하지 않았다. 
upstream-keepalive-connections: "0"

# 참고로 http 1.0 에서는 요청 처리후 연결을 끊지만 http 1.1 부터는 keepalive 가 기본으로 tcp 연결을 일정시간동안 유지한다.
In HTTP/1.1, persistence is the default, and the header is no longer needed (but it is often added as a defensive measure against cases requiring a fallback to HTTP/1.0).

# webdav 에서도 0.4.0.b1 부터 http1.1 을 사용하고 있었다.
0.4.0.b1
- Using HTTP/1.1 with keep-alive (Stéphane Klein)

# 사실 keepalive 는 파일 전송과 같이 지속적인 연결이 필요한 경우 효율성이 좋지만 새로운 연결(요청)은 세션이 부족할 경우 대기하는게 문제다.
# 예를 들어 수천개의 파일을 동시에 올릴때 thread=10개라면 10개는 처리되지만 이후 요청은 10개의 keepalive 가 종료(세션종료)때까지 대기해야 하는 문제가 있다.
# wsgidav 은 numthreads 개수 만큼 파이썬 프로세스가 떠서 요청을 받는 구조인데 numthreads=1000 처럼 늘리면 CPU 사용량은 늘어나겠지만 더 많은 새로운 요청을 받아 줄 수 있다.
# numthreads=1000 로 이미지를 새로 만들고 httpstat 테스트하면 세션수가 일정한 범위내에서 더 늘어나지 않는다.

# 실제 클리이언트를 사용해서 테스트
# 클라이언트는 10개의 worker thread 로 수만의 파일을 업로드 하고 있고 
# 서버의 가능 세션수가 1000 개인 상태에서 업로드를 수행하면
# 앞선 완료된 일정 시간 후 세션 클로즈 되고 다시 사용할 세션수 있는 세션수가 늘어나기 때문에 세션수가 일정하게 유지하면서 업로드를 할 수 있었다.
# 그리고 pod cpu 리소스는 최소 2000m 이상 잡아줘야 쓰레드를 충분히 사용하는것 같다.

# 요것도 원인 찾느라 힘들어서 개비스콘 짤 생생~ㅋ

windows 인터넷속도가 느릴때

# 기가 인터넷을 사용하는데 인터넷(다운로드)속도가 느리다면
# tcp receiver window size(수신 창 크기)를 조정해 보자.
# 윈도우에는 netsh 커맨드로 네트워크 설정을 변경할 수 있다.
# 우선 관리자모드로 cmd 를 실행하고 상태를 확인해 보면 normal 이다.
C:\WINDOWS\system32>netsh int tcp show global
활성 상태 쿼리하는 중...

TCP 글로벌 매개 변수
----------------------------------------------
수신측 배율 상태          : enabled
수신 창 자동 조정 수준    : normal
추가 정체 제어 공급자  : default
ECN 기능                      : disabled
5 RTO 타임스탬프                 : disabled
초기 RTO                         : 3000
수신 세그먼트 병합 상태    : enabled
비 SACK RTT 복원력             : disabled
최대 SYN 재전송             : 2
Fast Open                           : enabled
Fast Open 대체                  : enabled
속도 프로필                      : off

# tcp 수진 창 수준을 다음과 같이 변경한다.
C:\WINDOWS\system32>netsh interface tcp set global autotuninglevel=highlyrestricted
확인됨

# 확인
C:\WINDOWS\system32>netsh int tcp show global
활성 상태 쿼리하는 중...

TCP 글로벌 매개 변수
----------------------------------------------
수신측 배율 상태          : enabled
수신 창 자동 조정 수준    : highlyrestricted
추가 정체 제어 공급자  : default
ECN 기능                      : disabled
5 RTO 타임스탬프                 : disabled
초기 RTO                         : 3000
수신 세그먼트 병합 상태    : enabled
비 SACK RTT 복원력             : disabled
최대 SYN 재전송             : 2
Fast Open                           : enabled
Fast Open 대체                  : enabled
속도 프로필                      : off

mac wifi 속도 느려짐

macOS Mojave 10.14.2  사용중인데, 이상하게 wifi 속도가 느려지는 이슈가 있다.
맥을 리부팅하면 200 Mbit/s 이상의 속도가 나오다 어느정도 시간이 지나면
100 MBit/s
10 MBits/s
5 MBit/s
로 계속 떨어지고 결국에는 인터넷 서핑을 하기 힘들정도가 된다.

airport(wi-fi) 상태 정보를 확인해보면

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I

RSSI(Received Signal Strength Indicator) 는 수신강도로 음수로 표시되며 값이 높을수록(0에 가까울수록) 감도가 좋다. -80  보다 크면 양호

예) -60 이 -80 보다 수신강도가 좋다.

36 채널은 5GHz를 사용한다.
참고 https://en.wikipedia.org/wiki/List_of_WLAN_channels

     agrCtlRSSI: -60
     agrExtRSSI: 0
    agrCtlNoise: -96
    agrExtNoise: 0
          state: running
        op mode: station
     lastTxRate: 540
        maxRate: 600
lastAssocStatus: 0
    802.11 auth: open
      link auth: wpa2
          BSSID: x:xx:xx:xx:xx:xx
           SSID: ysoftman_wifi
            MCS: 0
        channel: 36,1

option 키를 누른상태에서 wifi 아이콘 클릭해 세부정보를 보면
5GHz, 802.11ac, 400Mbps로 정상적으로 보인다.


그런데 network utility.app 으로 wifi 보면 링크 속도가 낮게 보인다.


다음 명령으로 링크속도가 어떻게 설정되어 있는지 확인해보면 자동설정이라고 되어 있다.
ifconfig en0 | grep media
media: autoselect

같은 네트워크에서 갤럭시폰 링크 속도(전화에서 *123456# -> wifi 선택하면 보인다.)는 1Gbps 를 지원하는 802.11ac 네트워크로 실제 400Mbps 이다.


cron 으로 speedtest 매시간 돌려본 결과다.
맥북을 리부팅하면 속도가 잘 나오지만 시간이 갈수록 속도가 떨어진다.
Mon Jan 28 13:00:00 KST 2019 13:00  up  1:53, 3 users, load averages: 3.34 2.87 2.52 Download: 270.22 Mbit/s
Mon Jan 28 14:00:00 KST 2019 14:00  up  2:53, 4 users, load averages: 1.79 1.83 1.80 Download: 102.31 Mbit/s
Mon Jan 28 15:00:00 KST 2019 15:00  up  3:53, 3 users, load averages: 1.41 1.61 1.69 Download: 128.40 Mbit/s
Mon Jan 28 16:00:00 KST 2019 16:00  up  4:53, 4 users, load averages: 2.38 2.01 1.88 Download: 94.41 Mbit/s
... 생략 ...
Thu Feb  7 07:00:00 KST 2019 7:00  up 7 days, 18:01, 3 users, load averages: 1.45 1.57 1.59 Download: 1.77 Mbit/s
Thu Feb  7 08:00:00 KST 2019 8:00  up 7 days, 19:01, 3 users, load averages: 1.59 1.57 1.55 Download: 0.42 Mbit/s

wifi 는 최신 암호화 방식인 WPA2PSK-AES 를 사용해야 한다.
AES 를 뺀 나머지(WEP64, WEP128, TKIP)는 모두 금방 해킹된다.
https://www.bodnara.co.kr/bbs/article.html?num=106786

그리고 TKIP 사용하면 속도도 54Mbps 로 제한된다.
https://www.intel.co.kr/content/www/kr/ko/support/articles/000006697/network-and-i-o/wireless-networking.html

하지만 기업용 WPA2보안은 기본 AES암호화를 사용해 속도는 잘나와야 한다.
나와 같은 문제를 격어 apple 문의한 사람이 있는데, 아직 답이 없다.
https://discussions.apple.com/thread/8562488

wifi explorer lite 앱으로 주파수 상태를 양호한 편으로 큰 문제는 없는것 같다.


[시도1]
아무리 찾아봐도 특별한 원인은 찾을 수 없었는데, 사용자 위치 정보 wifi 설정으로 나아졌다는 글을 보고 설정을 변경해봤다.

참고로 저렇게 설정을 꺼두면 wifi 로 내위치를 확인하지 못한다.

시스템 환경 설정 -> 보안 및 개인정보 보호 -> 위치 서비스 -> 시스템 서비스 -> 세부사항 -> Wi-Fi  네트워크 비활성화 후 wifi 를 끄고 다시 시작한다.


위 설정후 처음에는 속도가 높았지만 점점 속도가 느려서 해결책이 되지 못했다.

[시도2]
다음 위치의 네트웍 관련 설정 파일들을 삭제하고 재부팅한다.
cd /Library/Preferences/SystemConfiguration
sudo rm -f
NetworkInterfaces.plist
com.apple.airport.preferences.plist
com.apple.wifi.message-tracer.plist
preferences.plist

하루정도 지나면 여전히 속도가 느려진다.

[시도3]
sysctl.conf 의 네트워크 관련 설정을 해보자.
https://rolande.wordpress.com/2010/12/30/performance-tuning-the-network-stack-on-mac-osx-10-6/
http://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/netperf/tuning-tcp.shtml#osx

현재 커널 tcp 설정 확인해 보면 send/recv 메모리 최대가 2MiB로 너무 작게 설정되어 있다. 참고로 리눅스와 sysctl 변수 이름과 다르다.
sysctl -a | grep -E "nmbclusters|maxsockbuf|tcp.*space|tcp.auto|tcp.win"
kern.ipc.maxsockbuf: 8388608
kern.ipc.nmbclusters: 65536
net.inet.tcp.sendspace: 131072
net.inet.tcp.recvspace: 131072
net.inet.tcp.autorcvbufmax: 2097152
net.inet.tcp.autosndbufinc: 8192
net.inet.tcp.autosndbufmax: 2097152
net.inet.tcp.win_scale_factor: 3

nmbclusters 는 네트워크에 사용되는 버퍼(메모리) 클러스터로 클러스터 1개가 약 2KiB 를 차지한다.

64MiB 를 메모리를 사용하려면 (1024*1024*64)/(1024*2) = 32768 개를 설정한다.

위 설정을 보면 이미 65536 으로 128MiB 로 설정되어 있다.
참고 https://wiki.freebsd.org/SystemTuning

nmbclusters 는 바로 적용할 수 없어 /etc/sysctl.conf 에서 수정해야 한다.
maxsockbuf 는 nmbclusters 이상 넘을 수 없다.

다음과 같이 64MiB 로 늘리려고 하면 다음과 같이 에러가 발생한다.

sudo sysctl -w kern.ipc.maxsockbuf=67108864
sysctl: kern.ipc.maxsockbuf=33554432: Result too large

sendspace, recvspace 은 maxsockbuf 이상 넘을 수 없다.

sudo sysctl -w net.inet.tcp.sendspace=4194304
sudo sysctl -w net.inet.tcp.recvspace=4194304

32MiB=33554432 또는 64MiB=67108864

sudo sysctl -w net.inet.tcp.autorcvbufmax=67108864
sudo sysctl -w net.inet.tcp.autosndbufmax=67108864

win_scale_factor(윈도우 크기 배수)도 최근 8배까지 지원되니 바꿔준다.
sudo sysctl -w net.inet.tcp.win_scale_factor=8

win_scale_factor rfc1323(TCP high performace) 스펙 추가사항이라

다음과 같이 활성화 해야 되지만 mojave 에선 더이상 설정할 수 없는것 같다.
sudo sysctl -w net.inet.tcp.rfc1323=1
sysctl: unknown oid 'net.inet.tcp.rfc1323'

위 내용 정리해서, sysctl -w 은 shutdown 하면 사라지기 때문에 /etc/sysctl.conf 를 수정하자.
kern.ipc.nmbclusters=65536
kern.ipc.maxsockbuf=67108864
net.inet.tcp.sendspace=4194304
net.inet.tcp.recvspace=4194304
net.inet.tcp.autorcvbufmax=67108864
net.inet.tcp.autosndbufmax=67108864
net.inet.tcp.win_scale_factor=8

참고로 netstat -m 으로 네트워크 메모리 사용현황을 파악할 수 있는데, 속도가 100Mbps 정도 나왔을때 다음과 같이 25% 정도를 네트워크에 사용하고 있다.
watch -n 1 'netstat -m'
814/1883 mbufs in use:
812 mbufs allocated to data
2 mbufs allocated to packet tags
1069 mbufs allocated to caches
787/1912 mbuf 2KB clusters in use
0/645 mbuf 4KB clusters in use
0/0 mbuf 16KB clusters in use
7156 KB allocated to network (24.8% in use)
0 KB returned to the system
0 requests for memory denied
0 requests for memory delayed
0 calls to drain routines

하루정도 지나면 여전히 속도가 느려진다.

[시도4]
블루투스가 영향이 있을까 해서 블루투스 비활성화 해봤지만 영향이 없음

[시도5]
wifi 및 시스템 전체 로깅을 실시간으로 볼 수 있다.

커널쪽에서 메시지만 골라 보면
log stream | grep kernel

다음과 같은 메시지가 주기적으로 나타난다.
kernel: (PulseSecureFirewall) PulseSecureDriver - IpPacketCookiesManager.cpp:226 - INFO Deleting expired cookies

pulse app 종료를 해도 계속 나타나  pulse app 을 지웠다.
지금까지는 꼭 재부팅을 해야 네트워크 속도가 올라갔는데, wifi만 끄고 켰는데 속도가 꽤 올라간다.
흠, 몇일 지켜봤는데 속도 저하는 발생하지 않고 있다.
pulse 9.0.2 버전에서 발생했고 이슈를 회사에 전달했고, 문제가 해결된 pulse 9.1 이상을 사용하고 있다.

참고로 pulse 를 완전 제거 후 장시간 맥북을 켜두면 wifi 속도가 현저하게 떨어지지 않지만 2~30mbps 정도로 유지되는 경우 wifi 를 컸다키면 다시 속도가 100mbps 이상으로 올라간다.

wsl 환경에서 netstat 사용하기

# WSL(Windows Subsystem for Linux) 에서
# 리눅스 netstat 가 작동하지 않는다.
which netstat
/bin/netstat

# wsl 에서는 .exe 를 실행할 수있다.
# (cmd.exe calc.exe explorer.exe 등을 실행할 수 있어 좋다.)
# 마운트된 C 드라이브의 윈도우 디렉토리의 netstat.exe 를 실행하면 된다.
# 윈도우 netstat.exe -p (PID/Program) 옵션이 없어 사용할 수 없다.
/mnt/c/Windows/System32/netstat.exe -nato

# 다음과 같이 alias 를 설정해 놓으면 편하다.
echo "alias netstat='/mnt/c/Windows/System32/netstat.exe'" >> ~/.zshrc

kernel time_wait

# 다음 netstat 로 time_wait 보면 PID/Program name 이 - 표시된 케이스가 있다.
netstat -natop | grep -i time_wait
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name     Timer

tcp        0      0 1.1.1.1:12345       2.2.2.2:10000      TIME_WAIT   -                    timewait (20.69/0/0)

# - 는 해당 포트를 사용하던 /proc/$PID 가 사라져(종료) 커널이 관리하게되는 경우다.
# 커널이 잡고 있는 time_wait 포트를 없애기 위해서는 네트워크를 종료하는 방법이 있지만 서비스 중인 서버에서는 사용할 수 없다.
/etc/init.d/network restart

# 드문 경우지만 MSL(Maximum Segment Lifetime, tcp 세그먼트가 네트워크에 존재하는 최대시간으로 보통 2분)이 넘어가서 서버로 부터 fin 을 받지 못할때 발생할 수 있다.
https://en.wikipedia.org/wiki/Maximum_segment_lifetime
# tcp_tw_reuse=1 로 재사용되지 않으면 net.ipv4.tcp_fin_timeout ~ MSL 시간이 지나면 사라진다.

# tcp_fin_timeout 확인
sysctl net.ipv4.tcp_fin_timeout

네트워크 관련 sysctl

# 연결 지향 tcp 는 데이터를 주고 받기전 우선 연결된다.
# 리슨을 위해 바인딩된 포트 열어 놓는 쪽은 passive open으로 서버가 되고,
# 연결을 요청하는 쪽은 active open으로 클라가 된다.
# tcp 종료 과정은 다음과 같다.
# 그림 출처 : 위키피디아 https://en.wikipedia.org/wiki/Transmission_Control_Protocol


# sysctl 은 런타임시에 커널의 파리미터를 설정하는 명령어다.
# /etc/sysctl.conf 파일로도 설정할 수 있다.
# /proc/sys/net/ipv4 에 파일 수정으로 설정할 수 있다.
https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
http://lxr.linux.no/linux+v3.2.8/Documentation/networking/ip-sysctl.txt
# 이중 net.ipv4 로 시작하는 tcp 제어 설정에서 중요한 몇개를 살펴 보자.

# 로컬 포트가 고갈되는 경우
# TIME_WAIT(fin을 받고 서버에 ack 보내고 일정 시간 기다리는 상태)의 소켓들을 재사용할지 여부
# 0 : 비활성화
# 1 : 활성화 (보통 1로 사용)
# 2 : loopback 에서만 활성화
net.ipv4.tcp_tw_reuse = 1

# FIN_WAIT_2(서버쪽 close 중임을 클라에게 알리는 ack 를 받았을때의 클라 상태)이후
# last_ack 를 받지 못했을때 대기시간으로 디폴트 60초이다.
# 참고로 TIME_WAIT 의 타임아웃은 커널소스에 60초로 하드 코딩되어 있다.
# /usr/src/kernels/3.10.0-957.1.3.el7.x86_64.debug/include/net/tcp.h
# #define TCP_TIMEWAIT_LEN (60*HZ)
net.ipv4.tcp_fin_timeout = 60

# 로컬 포트 사용(허용) 범위
net.ipv4.ip_local_port_range = 23768 60999

# tcp_tw_use 처럼 TIME_WAIT 상태의 소켓을 재사용(recycle)할지 여부
# 디폴트는 비활성화
# 여러 문제가 발생될 소지가 있어 최근 리눅스 4.12 에서는 제거되었다고 한다.
https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux
net.ipv4.tcp_tw_recycle = 0

close_wait 문제

TCP 의 close_wait 상태가 서버쪽에서만 있는 줄 알았는데 클라이언트(클라)에서도 close_wait 상태가 발생하였다. 운영중인 서비스의 서버가 클라입장이 되어 다른 서버로 요청을 하고 있었는데 다수의 close_wait 발생으로 소켓을 리소스가 점점 고갈되는 현상을 경험했다.

# 정상적인 세션 닫기(종료) 처리
1. 세션 종료를 위해 클라이언트가 서버로 FIN 패킷을 보내고 서버에서는 닫기처리를 수행한다. 이때가 서버는 close_wait 상태가 된다.
2. 서버에서 닫기 작업이 완료되면 클라이언트에 닫기 완료 패킷을 보내게 되고 클라쪽에서 정상적인 세션 종료 처리가 이뤄진다.

그런데 서버쪽에서 먼저 클라에게 종료 패킷을 보내게 되는 경우가 클라는 close_wait 상태가 된다. 서버는 세션 종료가 끝나 상태인데, 클라쪽에서는 세션 종료를 위해 FIN 패킷을 서버로 보내고 응답을 계속 기다리게 된다. 하지만 서버에서 응답을 받지 못해 계속 close_wait 로 남아 있게 된다.

결국 클라이언트 입장에서 close_wait 로 빠지는 세션들에 대해서 확실한 종료 처리 과정이 있어야 한다.
막연히 생각나는 방법으로 close_wait 상태에서 일정 시간이 지나면 강제로 세션 정리를 한다던지... 좀더 고민이 필요한 부분이다.

참고



Packet Capture (sniffer) tcpdump, windump, wireshark, rawcap

# tcpdump
# http://www.tcpdump.org/
# 리눅스 계열,  콘솔환경, libcap 사용
# 리눅스(우분투)에 설치
sudo apt-get install tcpdump

# 이더넷 장비를 사용하는것으로 root 권한으로 실행
# 모든 패킷이 캡쳐되어 보기 힘들다.
sudo tcpdump

# 다음과 같은 옵션을 주어 필요한 부분만 캡쳐해 보자
# host 123.123.123.123 : 호스트가 123.123.123.123 인 것만 in/out 캡쳐
# -A :  ASCII 로 패킷 출력
# -vvv : 자세하게 보기
# -c 10 : 패킷 10개만 캡쳐하고 끝내기
sudo tcpdump host ysoftman.test.net -A -vvv -c 10

# 소스가 ip 가 123.123.213.123 의 80 , 443 포트를 사용하는 패킷 캡쳐
# and 또는 &&
# or 또는 ||
# not 또는 !
sudo tcpdump 'src 123.123.123.123 and (port 80 or port 443)'

# tcp 포트가 80 이 패킷 캡쳐(http 캡처)
# https 443 포트는 암호화되어 있어 알아볼 수 없다.
sudo tcpdump 'tcp port 80'

# 자주 사용되는 옵션
# -D 사용가능한 interface 리스트
# -i 사용할 interface(이더넷카드)
# -X hexa코드와 ascii 를 같이 보여준다.
# -e protocol 출력
# -w 캡쳐한 내용 파일로 쓰기
# -l stdout line buffered, 패킷 캡쳐중에 데이터를 보고 싶을때(보통 파이프로 grep, sed 로 볼때 사용한다.)

# http 헤더만 보기
sudo tcpdump -vvvs 1024 -l -A | egrep --line-buffered "^........(GET |HTTP\/|POST |PUT |HEAD )|^[A-Za-z0-9-]+: " | sed -r 's/^........(GET |HTTP\/|POST |PUT | HEAD )/\n\1/g'


#####


# ssldump
# http://ssldump.sourceforge.net/
# ssldump 로 두 호스트간의 패킷을 decrypt 할 수 있다.
# -e 절대시간  timestamp
# -A 모든 레코드 출력
# -q quite mode 로 패킷을 한줄로만 표시한다.
# src, dst 명시에는 3가지 타입이 있고 명시하지 않으면 기본 host
# host hostname 또는 10.10.10.10
# net 10.10.0.0/16 (10.10.x.x)
# port 80
sudo ssldump -e -A -q 'dst 10.10.10.10'

# 출력 예시
# 2 : 커넥션 번호
# 3 : 커넥션에서 사용하는 레코드 번호
# 0.2001 : 연결후 상대적인 타임스탬프
# (0.0749) : 이전 레코드 이후 경과시간
# S>C : server to client
# Handshake : 레코드 타입
# (Handshake,IAlert,ChangeCipherSpec, application_data)
# Certificate : 레코드 내용(메시지)
2 3  0.2001 (0.0749)  S>C  Handshake      Certificate

# tcpdump 로 캡쳐한 파일을 읽을 수 있다.
# -r 캡쳐 파일로 부터 읽기
sudo tcpdump -e -w z.out
sudo ssldump -r z.out


#####


# WinDump
# http://www.winpcap.org/windump/install/
# 윈도우 계열, 콘솔환경, winpcap 사용
# windump 는 tcpdump 를 윈도우용으로 만든것으로
# tcpdump 와 기본적인 사용법은 같다.

# WireShark
# http://www.wireshark.org/
# 윈도우/리눅스 계열, GUI환경,
# wireshark 를 실행하면 GUI 환경에서 패킷을 캡처할 수 있다.
# libcap(리눅스), winpcap(윈도우) 사용, 패킷 분석 제공
# 네트워크 캡처 프로그램으로 유명한 WireShark 는
# 윈도우에서 보통 WinPcap 을 이용해서 패킷 캡쳐를 한다.
# tcpdump windump 등으로 패킷을 덤프한 파일을 열어 분석할 수 있다.
# 리눅스(우분투)에서 설치
sudo apt-get install wireshark

# RawCap
# http://www.netresec.com/
# 윈도우 계열, 콘솔환경
# 간단한 command line 상으로 패킷 캡쳐할 수 있다.
# RawCap.exe 실행 --> sniffer 할 인터페이스 선택 --> 캡쳐 내용을 저장할 파일명 선택
# 끝내려면 Ctrl+C

Linux 시스템 다양한 정보 보기, 성능 분석

# 시스템 정보 보기 (호스트네임,커널,프로세서,OS,..etc)
uname -a

# linux 이름 및 버전 정보 보기
vi /etc/issue

# 또는
cat /etc/*-release

# 사용자 리스트
vi /etc/passwd

# CPU 정보
vi /proc/cpuinfo

# memory 정보
vi /proc/meminfo

# 또는
# -m MB 로 표시, -g GB 로 표시,...etc
free -m

# 또는
# virtual memory 상태 -w wide
vmstat -w

# 또는
# -s status -S m MB 로 표시
vmstat -s -S m

# vmstat,mpstat,sar 설치
yum install sysstat

# memory 사용률 1초마다 갱신해서 5번까지 보기
vmstat 1 5

# 시스템 성능 통계
# cpu 사용률 1초마다 갱신해서 5번까지 보기
sar 1 5

# process 사용률 1초마다 갱신해서 5번까지 보기
mpstat 1 5

# Disk 별 uuid 정보
ls -ahl /dev/disk/by-uuid/

# Disk 사용량 보기
df -h

# 부팅 후 운용시간 보기
uptime

# dns 서버 설정
vi /etc/resolv.conf

# host 커스텀 설정
vi /etc/hosts

# hostname 보기
cat /proc/sys/kernel/hostname

# 시스템 정보
sudo dmidecode -t system

# 메모리 정보
sudo dmidecode -t memory

# 바이오스 정보
sudo dmidecode -t bios

# 소켓 간단한 상태 보기
cat /proc/net/sockstat

# 소케 메모리 사용량 확인
netstat -m

# 소켓 사용 현황 보기
# -n(numberic ip 로 표현, 도메인 리졸브 안함)
# -a(all)
# -t(tcp)
netstat -nat

# 또는
ss -nat

# 도메인 ip 보기
nslookup google.com

# 또는(좀더 자세하다.)
dig google.com

# 패킷 라우팅 보기
traceroute google.com

# 포트 범위
sysctl net.ipv4.ip_local_port_range

# 또는
cat /proc/sys/net/ipv4/ip_local_port_range

# tcp 관련 설정 정보
sysctl -a | grep net.ipv4.tcp

# 프로세스가 사용하는 시스템 콜 api 보기
sudo yum install strace
strace 명령어

# 예) ls 명령에서 open 시스템 콜만 골라 보기
strace -e trace=open ls

# 예) 실행중인 프레스 attach 해서, 결과 파일로 쓰기
strace -p 프로세스id -o zzz.strace

# 열린 파일 리스트
sudo yum install lsof
lsof

# 1234 포트 사용중인 파일 리스트
# 해당 PID 를 파악할 수 있다.
lsof -i :1234

# rsync 커맨드가 사용중인 파일 리스트
lsof -c rsync

# io 트랙픽 보기
sudo yum install iotop
sudo iotop

# network 트래픽 보기
# -i  eth0 으로 특정 네트워크 인터페이스를 지정할 수 있다.
sudo yum install iftop
iftop

# 시스템 부팅 시 메시지
dmesg -e

# 에러, startup, shutdown 등의 각종 시스템 이벤트 로그
sudo vi /var/log/messages


#####


# mac 참고
# 모든 정보
sysctl -a

# cpu 브랜드 이름
sysctl -a | grep cpu.brand_string

# cpu 개수
sysctl -n hw.ncpu

# 메모리 크기
sysctl -n hw.memsize

# 메모리 사용량 1초마다 보기
vm_stat  1

# 컴퓨터 이름 보기
networksetup -getcomputername

# 컴퓨터 이름 설정
networksetup -setcomputername "ysoftman macbook pro"

# 사용 가능한 네트워크 종류 보기
networksetup -listallnetworkservices

# 연결중인 네트워크 리스트
networksetup -listallhardwareports

# wi-fi(listallnetworkservices 중하나) 정보
networksetup -getinfo wi-fi

# en0(보통 wi-fi) 끄기
networksetup -setairportpower en0 off

# en0(보통 wi-fi) 켜기
networksetup -setairportpower en0 on

# airport(wi-fi) 상태 정보
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I

# 시스템 자세한 정보
system_profiler

# 시스템 자세한 정보(app)
spotlight -> 시스템 정보.app(또는 system profiler 로 실행)

# 시스템 메시지(로그)
# mac 에선 dmesg 로 부팅 로그 전체를 볼 수 없어 log 를 사용하는것이 좋다.
# log 는 dmesg 를 포함한 시스템 로그를 취합해 보여준다.
# start 날짜 이후의 시스템 메시지
log show --start "2010-02-19"

# 실시간 시스템 로그 보기
log stream

# 로그 전체 삭제
sudo log erase --all

# 시스템 로그 파일
vi /var/log/system.log

# 참고 리눅스에서 상황/대상별에 맞는 분석/성능 툴
http://www.joyent.com/blog/linux-performance-analysis-and-tools-brendan-gregg-s-talk-at-scale-11x


Windows XP TCP/IP 와 RJ45 UTP Cross Cable 을 이용한 PC to PC 연결

사용 프로토콜 : Transmission Control Protocol / Internet Protocol
사용 케이블 : UTP(Unshielded Twisted Pair) Cable - RJ45
PC A와 PC B를 1:1로 연결시 설정

// PC A
IP Address : 192.168.0.2
Subnet Mask : 255.255.255.0

// PC B
IP Address : 192.168.0.3
Subnet Mask : 255.255.255.0