서버 : 소켓을 생성, 주소 할당, 연결 요청 기다림, 요청에 대한 응답
클라이언트 : 소켓을 생성, 주소 할당, 연결 요청
두 시스템이 통신을 하기 전에 클라이언트는 포트가 Close상태, 서버는 해당 포트로 항상 서비스를 제공할 수 있도록 Listen 상태
처음 클라이언트가 통신을 하고자 하면, 임의의 포트 번호가 클라이언트 프로그램에 할당, 클라이언트는 SYN Sent 상태가 됨, 서버에 연결을 하고싶다는 의사 표시
서버는 클라이언트의 연결 요청을 받고, SYN Received 상태가 되고, 연결을 해도 좋다는 의미로 SYN+ACK패킷을 보낸다
마지막으로 클라이언트는 연결 요청에 대한서어븽 응답을 확인했다는 표시로 ACK 패킷을 서버에 보낸다
Client SYN -> Server SYN+ACK -> Client ACK -> Server
두 시스템이 통신을 하는 중에는 클라이언트와 서버 모두 Established 상태
통신을 끊고자 하는 클라이언트가 서버에 FIN 패킷 전송 이떄 클라이언트는 Close Wait 상태가 됨
서버는 클라이언트의 연결 종료 요청을 확인하고, 응답으로 ACK 패킷을 보낸 뒤, 서버도 클라이언트의 연결을 종료하겠다는 의미로 FIN 패킷을 보냄, 그후 Close Wait 상태가 됨
마지막으로 클라이언트는 연결 종료 요청에 대한 서버의 응답을 확인했다는 의미로 ACK 패킷을 서보로 보낸다
Client FIN -> Server ACK, FIN -> Client ACK -> Server
이전에 와이어 샤크를 사용해본적은 있지만 정확하게 어떤 원리로 패킷들을 목록화하는지는 모르겠다.
실행시키니 현재 네트워크에서 통신이 되고 있는 패킷들이 쭉 나열되었고 하나의 TCP 패킷을 잡아서 분석해보았다.
하단 회색 부분은 Ethernet header(src & dst MAC address), IP header(src & dst IP address) 정보와 함께, TCP header 부분의 정보가 담겨있다.
: 발신지에서 오픈된 필드로, 58571 포트인 것을 확인할 수 있다.
: 수신지에서 오픈된 필드로, 443번 포트인 것을 확인할 수 있다. (SSL 포트)
(80번 / 443번 포트는 웹서버의 기본 포트이다.)
: TCP 세그먼트의 첫번째 바이트에 부여되는 고유한 숫자 값으로 TCP 세그먼트들 간의 식별이 가능하며, 통신할 때 패킷 손실이 일어나는 것을 방지하는 목적으로 사용된다. 이 순차번호는 패킷에 포함되어있는 데이터만큼 증가한다.
: 데이터 수신을 확인하는 번호로 수신한 마지막 바이트의 순서번호에 +1한 값이다.
: TCP 헤더의 길이이다. 필드 값은 4bytes 씩 증가하므로 위의 패킷은 5*4=20(bytes)이다.
[Reserved]
-> 미래에 사용하기 위해 남겨둔 예비 필드로 0으로 채워져야 함
[Flag Filed]
Nonce
: Explicit Congestion Notification은 네트워크 상에서 일어날 가능성이 있는 혼잡을 미리 탐지하여 송신측에 전달하고 전송 속도를 조절하는데, 이 필드는 ECN-nonce를 은폐 및 보호한다.
Congeston Window Reduced
: 호스트가 ECE 플래그가 포함된 TCP 세그먼트를 수신했고, 혼잡 제어 메커니즘에 의해 응답했음을 알림
ECN-Echo
-> SYN=1 : TCP 상대가 ECN이 가능함 = 혼잡하다!!!
-> SYN=0 : IP헤더셋에 혼잡 경험 플래그가 설정된 패킷이 정상적인 전송 중에 수신되었음
Urgent
: 긴급하게 처리해야 하는 데이터 포함. 1로 설정되어 있는 패킷은 순서 상관없이 먼저 송신
Acknowledgment
: 비트가 1이면 확인응답을 뜻하고, ack number는 다음에 받을 것으로 예상되는 데이터의 순서번호를 나타낸다.
Push
: 데이터를 응용계층으로 보낼지의 여부 결정 (데이터의 강제전송 느낌)
Reset
: TCP 연결 재설정 여부 결정
Syn
: 호스트 간의 순서번호를 동기화하여라 (TCP hand shaking 단계)
Fin
: finish 비트는 프로세스 완료. 아래 사진을 참고해보면 Calculated window size : 65536이 있는데 이것이 0이 되면 보내는 것을 중단하며 [FIN,ACK] 사인을 클라이언트가 보낼 때, Fin 플래그가 1로 설정되어 보내진다.
[Window Filed]
: TCP 수신 버퍼를 바이트 크기로 표시한 것으로, 0이면 프로세스의 전송을 중지한다. window 안에 표기된 크기만큼 전송했을 때 문제가 없다면 다음 전송 때 2배의 window 크기로 보낸다. 만약 수신측에서 window size를 보내면 그것에 맞춰서 전송속도를 조절한다.
[Checksum Field]
: TCP 데이터가 중간에 훼손되거나 변조되었는지 체크하는 필드이다.