일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 운영체제
- JUCE library
- 알고리즘
- C++ library
- 자료구조
- 백준
- C++ gui 라이브러리
- tour of go
- LOB
- C++ gui
- 코딩
- c++ heap
- 프로그래밍
- 리듬게임
- C언어
- BOJ
- vim-go
- a tour of go
- C++
- JUCE 튜토리얼
- go
- gui
- JUCE
- Docker
- Nebula
- go channel
- 연결리스트
- 공룡책
- JUCE라이브러리
- OS
- Today
- Total
CafeM0ca
[Network] TCP 정리 본문
이번에 과제가 외주로 들어왔는데 미쿡에서 유학하시는 분인 것 같더라.
대학을 다니는데 본인 과제가 외주로 오는 경우는 2가지가 있다.
1. 돈이 많아서 맡기고 놀러 다니거나
2. 학점으로 인해서 장학금에 금이 간다거나..
2의 경우를 좀 더 세분화하면 수업 시간에 농땡이 피우다가 발등에 불 떨어지는 경우와 혼자서 진짜 하다가 안되니까 맡기는 경우가 있는데, 이번 의뢰인은 후자의 경우 같더라.(조금 떠보면 알 수 있다)
TCP에 기억나는 거라고는 사실 3-way handshake정도?
https://cafemocamoca.tistory.com/213
TCP는 위키피디아에 괜찮게 적혀 있는데
ko.wikipedia.org/wiki/전송_제어_프로토콜
tcp 패킷이 아니라 tcp 세그먼트라고 표현한다. 세그먼트가 TCP 프로토콜 데이터 유닛(PDU)의 정확한 표현이라고 하니, 어디가서 TCP 세그먼트라고 말하고 다니자.
위키피디아에 보면 TCP 헤더 그림이 있다.
네트워크에서 TCP 세그먼트가 날아오면! 저 순서대로 받게 된다는건데
맨 처음 2바이트(16비트)는 source port(보내는쪽 포트)
그 다음 2바이트는 destination port(받는 쪽 포트)
그 다음 4바이트는 sequence number(TCP segment를 보내는 번호)
그 다음 4바이트는 Acknowledgment number(sequence number에 대한 답장 번호)
이런 식으로 데이터가 쭉 이어진 형태다.
여기서 다룰 것들은 아래와 같다.
1. tcp에서 이게 뭐지 싶은 것들(window size, 등)
2. python의 dpkt 라이브러리로 값 직접 보는 법
아래 블로그에서 UDP Header 정보 전까지 보고 오자.
velog.io/@hidaehyunlee/TCP-와-UDP-의-차이
TCP 연결에는 3-way handshake와 4-way handshake가 있고 각각 연결과 연결종료의 과정이다. pcap파일을 wireshark(패킷 캡쳐 툴)로 보면
이후에는 클라이언트가 본격적으로 데이터를 보내기 시작한다.
window size라는게 있다. 수신자가 받을 수 있는 데이터 크기이며 byte 단위다. window size의 최대값은 16bit(=2byte)로 64K(65,535)이였는데 window Scaling 옵션으로 window_size의 최대값 보다 많이 보낼 수 있게 해준다.
MMS라는 것도 있는데 Maximum segment size로 tcp 에서 세그먼트의 최대값을 의미한다.
TCP congestion control(혼합 방지)라는게 있는데, 네트워크 부하로 segment가 손실 되는 것을 줄이는 것이다.
방법에는 2가지 Tahoe와 Reno가 있다. ko.wikipedia.org/wiki/TCP_혼잡_방지_알고리즘
위 에서 타호와 리노에 대해 알았으면 fast retransmit과 fast recovery에 대해서 알아야하는데 아래 글을 참조하자.
위까지 이해 했으면 마지막으로 이 게시글을 보면 된다.
파이썬 dpkt로 pcap파일을 내용 보는 법
몇 줄 없다.
간단한 코드다.
pcap 파일을 읽어들이고 각 패킷을 뽑아 낼 수 있다.
buf에는 데이터가 담겨 있고 (buf를 출력해보면 바이너리 형태라서 읽을 수 없으니 읽을 수 있게 바꿔줘야 한다.)
tcp 객체에는 우리가 필요한 값들 sport(송신측 포트), dport(수신측 포트), tcp.flags(ACK인지 플래그들..)이 담겨있다. 자세한건 tcp 객체를 출력해보자.
참고
www.networkcomputing.com/data-centers/network-analysis-tcp-window-size
'Hacking > 기본기' 카테고리의 다른 글
[Network] Proxy와 VPN(Virtual Private Network) (0) | 2019.03.30 |
---|---|
[NetWork] 3 way handshake (0) | 2018.07.24 |
[기본기]심볼이 깨진 바이너리파일 (0) | 2018.02.01 |
[기본기]함수 호출 규약 (0) | 2018.01.12 |