TCP 프로토콜(Protocol)

오늘은 TCP 프로토콜에 대해서 알아보겠습니다.


참고 문서입니다.


TCP 헤더 형식입니다.


위의 숫자(0~31)는 비트 수를 나타냅니다.


TCP는 포트 번호로 찾습니다.

그래서 Source Port(시작 포트)와 Destination Port(도착 포트)가 있습니다.


Sequence Number로 자신의 번호를 알려줍니다.


Acknowledgment Number로 상대방의 번호를 보냅니다.


Control Bits로는 URG, ACK, PSH, RST, SYN, FIN이 있습니다.


Window는 데이터의 흐름을 제어합니다.





TCP 연결 상태표입니다.

CLOSED : 연결 상태가 없다는 뜻입니다.

LISTEN : 포트가 열린 상태로, 연결이 들어오길 기다리는 상태입니다.

SYN-SENT : 상대에게 SYN을 보낸 상태입니다. 상대의 ACK와 SYN을 기다립니다.

SYN-RECEIVED : SYN을 받고, ACK와 SYN을 보낸 상태입니다.

ESTABLISHED : 연결이 완료된 상태로, 데이터 교환이 가능합니다.

FIN-WAIT-1 : FIN을 보낸 상태입니다. FIN의 ACK를 기다립니다.

FIN-WAIT-2 : 상대의 FIN을 기다립니다.

CLOSING :  상대의 FIN에 대한 ACK를 기다립니다.

TIME-WAIT : 상대가 FIN의 ACK를 받을 시간을 기다립니다.

CLOSE-WAIT : FIN을 받고 ACK를 보낸 상태입니다. 종료를 기다립니다.

LAST-ACK : FIN을 보낸 상태고, 마지막 ACK를 기다립니다.

CLOSED : 포트가 닫힙니다.








기본적인 연결 구조입니다.

SEQ에 자기 번호를

ACK에는 상대방 번호를 적어줍니다.


DATA를 보낼 때에 Sequence Number는 증가하지 않습니다.



RST는 잘못된 상태를 바로잡아줍니다.


RST를 받으면, LISTEN 상태가 되거나, CLOSED 상태가 됩니다.



일반적인 종료 방식입니다.

여기서 알 수 있는 것은, 먼저 FIN을 보낸 쪽이, FIN-WAIT 상태로 되고, 받는 쪽은 CLOSE-WAIT 상태가 됩니다.




PUSH는 전달되어야 할 데이터가 포함되었다는 뜻입니다.




끝.


카테고리: tcp, network

댓글

이 블로그의 인기 게시물

Python OpenCV 빈 화면 만들기

Python urllib.parse.quote()

Python bytes.fromhex()

Android AVD Ram size change

Forensics .pyc 파일 .py로 복구하기

Android Minimum touch target size

KiCad 시작하기 7 (FreeRoute 사용하기 2)

Android Notification with Full Screen

C++ OpenCV 모폴로지 침식, 팽창

KiCad 시작하기 2 (PCB 만들기)