Category: Linux

  • IP Header

    UDP 패킷을 만들었다고 전송할 수 있는 것이 아니었다. IP 헤더 부분을 추가해 주어야 한다고 한다. 직접 구현해 봐야 Pico에서 뭐를 수정해야 하는지 알 수 있을 것 같았다. 기본적인 것은 코파일럿이 해주었지만 관련 자료를 찾아 보았다.

    IP 헤더와 관련된 것은 RFC 791이다. 구조는 아래와 같다.

    코파일럿이 친절하게 거의 다 코드를 구현해 주었다.

    ip_ver = 4
    ip_ihl = 5
    ip_tos = 0
    ip_tot_len = 20 + udp_length
    ip_id = 54321
    ip_frag_off = 0
    ip_ttl = 64
    ip_proto = 17
    ip_check = 0
    ip_saddr = socket.inet_aton(src_addr)
    ip_daddr = socket.inet_aton(dst_addr)
    ip_ihl_ver = (ip_ver << 4) + ip_ihl
    ip_header = struct.pack('!BBHHHBBH4s4s', ip_ihl_ver, ip_tos, ip_tot_len, ip_id, ip_frag_off, ip_ttl, ip_proto, ip_check, ip_saddr, ip_daddr)

    checksum에 해당하는 값은 ip_check 이고 0으로 되어 있는 것을 볼 수 있다. 제대로 하고 싶다면 이것도 계산해 주어야 한다. UDP 패킷과 같은 구조로 되어 있다. 계산해 준 다음 다시 작성해 주면 된다.

    ip_header_checksum = checksum(ip_header)
    
    ip_header = struct.pack('!BBHHHBBH4s4s', ip_ihl_ver, ip_tos, ip_tot_len, ip_id, ip_frag_off, ip_ttl, ip_proto, ip_header_checksum, ip_saddr, ip_daddr)
  • tshark

    Pico에서 제대로 데이터를 전송하는지 알기 위해서는 Pi에서 제대로 들어오는지 확인해야 한다. 보통 wireshark를 이용하는데 CLI 환경에서는 tshark를 이용할 수 있다.

    Pico는 10.10.10.11를 지정하고, 5001 포트를 이용해서 10.10.10.174를 이용하는 Pi에 7070 포트로 UDP를 전송한다. 이를 tshark로 확인하려면 다음과 같이 한다.

    들어 오는지 확인할 경우. 10개를 확인하고 종료하기 위해서 -c 10 추가함.

    sudo tshark -i any -n -f "udp port 7070" -c 10

    데이터를 직접 확인하고 싶을 경우 -x 추가함.

    sudo tshark -i any -n -f "udp port 7070" -c 1 -x

    상세 내역을 보려면 -V 추가함

    sudo tshark -i any -n -f "udp port 7070" -c 1 -x -V

    가장 아래에 보면 데이터가 의도한 대로 잘 들어오고 있는 것을 알 수 있다.

    기본적으로 validation은 시행하지 않는다. 그래서 아래와 같은 내용이 포함된 것을 볼 수 있다.

    Header Checksum: 0xf8bd [validation disabled]
    [Header checksum status: Unverified]

    IP 헤더와 UDP 헤더의 checksum이 제대로 되었는지 확인하려면 다음과 같이 한다. -o 에서 해당 항목을 추가해 주어야 한다. correct와 Good를 볼 수 있다.

    sudo tshark -i any -n -f "udp and src host 10.10.10.168 and dst port 7070" -c 10 -V -x -o ip.check_checksum:true -o udp.check_checksum:true
  • UDP 패킷 구조

    UDP 는 header 와 data 로 구성되어 있다. 구성은 다음과 같다. 3번째 length는 header를 포함한 길이라고 한다.

    그런데 checksum 계산을 할 때에는 앞에 덧붙는 값들이 있다. pseudo header 이다. udp에 해당하는 protocol 값은 17이다. udp length라는 항목이 새롭게 있는데 udp header의 length와 같은 값이다.

    전체 구조는 다음과 같다.

    다시 처음으로 돌아간다. RFC 0768에 checksum은 다음과 같이 정의한다.

    Checksum is the 16-bit one's complement of the one's complement sum of a
    pseudo header of information from the IP header, the UDP header, and the
    data,  padded  with zero octets  at the end (if  necessary)  to  make  a
    multiple of two octets.

    일단 checksum을 구하기 위해서 pseudoheader를 포함한 전체 값이 있어야 한다. 초기 값에 대한 설명이 없는데, 0x0000으로 두고 계산한 다음 해당하는 위치에 그 값을 넣어준다고 한다.

    마지막으로 checksum을 0x0000으로 하면 무시하도록 되어 있다.

    If the computed  checksum  is zero,  it is transmitted  as all ones (the
    equivalent  in one's complement  arithmetic).   An all zero  transmitted
    checksum  value means that the transmitter  generated  no checksum  (for
    debugging or for higher level protocols that don't care).
  • picoshare

    TrueNAS Scale에서 FileBrowser를 이용하고 있었다. TrueNAS OS 업그레이드 하는 과정에서 app이 삭제되었는데 재설치 후 로그인이 안되었다. 문제를 해결하려고 하다가 대안을 찾았다.

    딱 원하는 목적에 맞다.

    docker run \
      --env "PORT=4001" \
      --env "PS_SHARED_SECRET=somesecretpass" \
      --publish 4001:4001/tcp \
      --volume "${PWD}/data:/data" \
      --name picoshare \
      mtlynch/picoshare

    기본적으로 위와 같이 설치하라고 한다.

    volume 부분을 하면 data 폴더에서 내부 파일을 열람할 수 있다. 공용으로 사용할 것이 아니라면 안해도 된다.