TCP 제어 플래그
네트워크 트래픽이 예상대로 작동하지 않을 수 있는 문제를 해결 할 수 있게
우리는 정확한 작동 방식을 이해하고 있어야한다.
TCP 가 연결을 설정하는 방법은 특정한 순서로 사용되는 TCP 제어 플래그를 사용하는 것이다6개의 TCP 제어 플래그를 헤더에 나타나는 순서대로 봐보자
첫번째 flag 는 URG 다
긴급성의 줄임말로 1의 값을 가지면 세그먼트가 긴급하다고 간주를해 긴급 포인터 필드에
이에 대한 데이터가 더 있음을 나타낸다.
두번째는 acknowlege의 줄임말인 ACK 다
필드에 값이 1이면 승인 번호 필드를 검사해야함을 뜻한다.
세번째는 PSH 로 push의 줄임말이다.
데이터를 보내는 장치는 수신 장치에 현재 버퍼링이 된 데이터를 어플리케이션에 가능한 빠르게 넣고 싶어한다.
버퍼는 다른 곳에 보내기 전에 일정량의 데이터를 어딘가에 보관하는 건데,
TCP 에서는 더 효율적으로 큰 청크 데이터를 보내기 위해 사용된다.
버퍼에 데이터를 keep 해둠으로써,
더 중요한 청크 데이터를 어플리케이션에 전달 할 수 있게 된다.
근데 가끔은 작은 양의 정보지만 즉시 응답을 받기 위해 listening program 이 필요 할 수 있다.
이걸 push flag 가 한다.
네번째 플래그는 RST , reset의 줄임말이다.TCP 연결의 한쪽 클라이언트가 세그먼트를 제대로 복구 하지 못했다는 것을 의미한다.연결 클라이언트 중 하나가"데이터 종합이 안돼 처음부터 다시 하자" 고 하는 방식이다.
다섯번째 플래그는 SYN 으로 sync 를 뜻한다.TCP 연결을 처음 설정하고 , 수신 쪽에서 시퀀스 번호 필드를 검사 할 수 있는지 확인할때 사용한다.
마지막으로 FIN , finish 를 뜻한다.이 플래그가 1 이면 송신 쪽이 더 이상 전송할 데이터가 없어서연결을 닫을 것을 뜻한다.
TCP 제어 플래그가 어떻게 사용되는지 예를 들어보자
송신 컴퓨터 A 와 수신 컴퓨터 B 가 있다.
프로세스를 시작하려면
컴퓨터 A 는 TCP 세그먼트를 컴퓨터 B 에 SYN flag를 set 한 후 보내게 된다.
이건 컴퓨터 A 가
"연결을 맺자 내 시퀀스 넘버 필드를 보면 이 대화가 어디서부터 시작되는지 알 수 있어"
그러면 컴퓨터 B 가 SYN 과 ACK 필드를 설정 후 TCP 세그먼트를 응답으로 보내게 된다.
컴퓨터 B는
"그래 연결 맺자, 너의 시퀀스 번호를 승인할게" 하고 말하는 것이다.
컴퓨터 A 는 다시 ACK 플래그를 설정 후 응답을 보낸다
"너가 승인 한 걸 알겠어 자 이제 데이터를 보내기 시작하자" 하는 것이다.
SYN, ACK/SYN, ACK 세트는 TCP 연결이 설정 될 때 마다 발생한다.
이걸 바로 three way handshake 라 한다.
일단 three way handshake 가 완료되면,
TCP 연결이 설정 된다.
이제 컴퓨터 A 는 자유롭게 데이터를 컴퓨터 B 로 보낼 수 있고 반대로도 마찬가지로 보낼 수 있게 된다.
이제 양 쪽은 보낼때마다 SYN/ACK 페어를 보낸다
전송되는 각 세그먼트는 SYN/ACK 세트로 응답을 해서 상대방이 항상 데이터를 받았는지 확인을 한다.
이제 한쪽에서 연결을 종료시키려 할때면,
4 way handshake 가 발생한다.
연결을 종료할 준비가 되면 다른 쪽에서는 ACK 로 인식하는 FIN 플래그를 전송한다.
그럼 다른쪽도 연결을 종료시킬 준비를 하고 여기서도 FIN 플래그를 본내다.
이제 다시 양쪽에서 ACK 플래그를 전달하면서 끝내게 된다.
이론적으로는 TCP 연결이 한쪽만 닫히는 경우가 유지 될 순 있다.
하지만 이건 자주 마주할 문제는 아니다.
이제 다음으로는 TCP 소켓 상태 정보를 봐보자
TCP Socket State
TCP 소켓은 인스턴스화 하기 위해 실제 프로그램이 필요하다.
가상의 것이라 느껴지는 포트와 대조적일 수 있다.
내가 원하는 port 에 트래픽을 전송 할 수 있지만, 해당 포트에 소켓이 열려있어야지만 응답을 받을 수 있다.
TCP 소켓은 많은 상태가 존재 할 수 있다.
첫번째 상태는 LISTEN 이다
LISTEN은 TCP 소켓이 준비되어있고 수신 대기 중임을 뜻한다.
서버 쪽에서만 볼 수 있다.
두번째는 SYN_SENT 다
이건 동기화 요청이 전송 되었지만, 아직 연결이 설정 되지 않은 걸 뜻한다.
클라이언트 쪽에서만 볼 수 있다.
세번째는 SYN_RECEIVED 다.
이건 이전에 listener state 에 있던 소켓이 동기화 요청을 수신하고 SYN_ACK 를 다시 전송 했다는 것을 뜻한다.
하지만 아직 클라이언트로부터 마지막 ACK 는 받지 않았다.
이건 서버쪽에서만 볼 수 있다.
네번째로는 ESTABLISHED 다.
TCP 연결이 작동하고 있고 양쪽 서로 데이터를 자유롭게 보낼 수 있는 상태를 뜻한다.
클라이언트 서버 모두 볼 수 있다.
다섯번째로는 FIN_WAIT 다.
FIN 이 전송되었지만, 아직 다른 쪽에서는 ACK 가 수신 되지 않은 걸 뜻한다.
CLOSE_WAIT
이건 TCP 계층에서 연결이 닫혔지만 ,
소켓을 연 어플리케이션이 아직 소켓을 잡고 있는 상태
CLOSE
연결이 완전히 종료된 상태로 더이상의 통신이 불가능 하다는 뜻
'프로그래밍 > 네트워크' 카테고리의 다른 글
[Coursera Google] The Application Layer (0) | 2020.12.11 |
---|---|
[Coursera Google] The Transport Layer - connection , connectionless (0) | 2020.12.10 |
[Coursera Google] The Transport Layer (0) | 2020.12.08 |
[Coursera Google] The Network Layer - Routing (0) | 2020.12.07 |
[Coursera Google] The Network Layer - Subnetting (0) | 2020.12.06 |