[NW] TCP Flag

Computer Networks 2013. 9. 22. 03:59

※ 질문/내용오류/공유할 내용이 있다면 jinkilee73@gmail.com으로 메일 주세요 :-)


저번 포스팅에서 TCP의 Flow Control과 Error Control을 공부했다. 저번에 말 했듯이, 이번 포스팅에서는 TCP의 Flag에 대하여 설명을 할 예정이다. TCP Flag를 설명하면서 동시에 TCP 헤더에 있는 Flags 필드를 같이 설명할 예정이다.


TCP 헤더에서 TCP Flag는 총 6 비트를 차지한다. 그 6개의 비트는 다음과 같다.


URG, ACK, PSH, RST, SYN, FIN


위의 6비트들이 on/off되면서 어떤 것을 알려주는지 알아보자. 쉬운 것들부터 설명을 해보도록 하자. SYN과 ACK를 먼저 공부해보자. 이것들을 이해하기 위해서는 3 way handshaking을 이해하면 좋다. TCP는 session oriented한 프로토콜이다. 즉, 세션이 맺어져야 TCP를 사용할 수 있다는 이야기이다. 이렇게 TCP를 이용하기위해 TCP 세션을 맺는 과정을 3 way handshaking이라고 부른다. 이 과정은 아래와 같다.


그렇다. 모든 TCP 통신은 위와 같이 TCP 세션을 맺은 후 수행되게 되어있다. 그 내용을 자세하게 들여다 보자. A 패킷을 먼저 보자. 임의로 Seq를 8000으로 세팅하고 보냈다. 유의할 점은 이 패킷은 sender와 receiver 간의 가정 처음에 보낸 데이터이기 때문에 ACK를 설정할 이유가 없다는 것이다. (이 부분이 이해가 안 간다면 이전의 포스팅을 참고해라.) 그리고 A 패킷의 가장 아래 행이 6개로 나뉘어있다는 것에 주목하자. 저 부분이 TCP  Flag의 6 비트라고 하고 이야기해보자. 저 부분을 보면 두번째 오른쪽 칸에 S라고 적혀있다. 저 자리가 바로 SYN 비트의 자리이다. 저 자리의 값이 1로 되어있다는 말은 SYN이 세팅되었다는 말과 동일하다.


B 패킷을 보자. ACK는 당연히 8001이다. 그리고 자기 나름데로 Seq를 15000으로 세팅해서 보내는데, TCP Flag를 보면 ACK와 SYN이 세팅되어있다. ACK는 이전에 sender가 보낸 A패킷에 대한 응답임을 의미하기 위함이다. SYN은 receiver가 처음으로 보내는 SYN이다. 


C 패킷을 보자. ACK만 세팅되어있다. 이는 이전에 receiver가 보낸 B 패킷에 대한 응답이라는 뜻이다. 여기서 중요한 부분은 Seq가 8001이라는 점이다. 간단하게 생각해보자. 앞서 말했듯이 Seq는 보낼 데이터의 시작 바이트이다. 제일 처음에 SYN 패킷을 보냈을 때 8000을 보냈는데 그 때는 아무런 데이터를 보내지 않았다. 그러면 8000이어야 하지 않나? 그런데 왜 8001일까? 내가 참고하는 책에 따르면, 제일 처음 SYN 패킷을 보낼 때 아무런 데이터를 보내지 않음에도 불구하고 1바이트를 보내는 것처럼 작동한다고 한다. 그래서 실제로 보낸 데이터는 없지만 8001로 세팅이되어 3 way handshaking의 마지막 ACK 패킷을 보낸다. 


이것이 데이터를 전송하기 전에 맺는 Connection Establish 과정이다. 다음에 설명할 내용은 데이터 전송 과정이다. 이 부분은 앞에서 Flow Control과 Error Control 과정을 설명할 때 자세하게 설명했다고 생각한다. 추가적으로 설명할 부분이 있다면, PSH 비트정도이다. PSH는 PUSH의 약자이다. 일반적인 책이나 사이트에서 PSH 비트를 설명한 것을 보면 "즉시 데이터를 전송하도록 하는 비트"라고 설명을 한다. 내 개인적인 의견으로는 이렇게 설명을 하면 이해하기 어렵다. 나는 이렇게 설명하고 싶다. MTU가 꽉 차지 않았음에도 그냥 보내도록 하는 비트. 예를 들어 지금 보낼 수 있는 MTU는 1500인데 실제로 보낼 데이터가 700 밖에 되지 않으면 어떻게 해야하나? 꽉 차지 않았음에도 그냥 보내야 한다. 이렇게 패킷의 MTU보다 실제로 보낼 데이터가 적을 때 PSH를 세팅해서 보낸다. 아래와 같다.


이렇게 꽉 채워지지 않은 상태에서 보낸다는 의미는 다르게 해석하면 receiver process에게 최대한 빠르게 데이터를 전달해준다는 의미도 있다. 패킷이 꽉 찰때까지 기다리지 않아도 되니까 receiver에게는 그만큼 더욱 빠르게 도달하겠지.


데이터 전송에 쓰이는 또 다른 TCP Flag 비트는 URG 비트이다. 이는 Urgent 의 약자이다. TCP 헤더에서 Urgent pointer라는 필드가 있다. 이 필드는 반드시 TCP Flag의 URG 비트가 세팅되어있어야 의미가 있는 필드라고 이전에 설명을 다 한 상태이다. 이 비트는 거의 쓰이지 않는다. 아마 보기 힘들거라고 들었다. 정확한 사용법에 대해서는 나도 잘 모르겠다. 우선 이 부분에 대한 자세한 설명은 무기한 연장하겠다.


그 다음 설명할 비트는 FIN 비트이다. Finish의 약자이다. TCP에서 3-way handshaking을 통해 세션을 맺는 과정이 있듯이 세션을 끊는 과정도 있다. 이 과정에서 FIN 비트가 사용된다. 아래와 같다.

위와 같다. 3-way handshaking 과 별반 다를 것이 없다. 굳이 찾는다면 FIN 비트가 SYN 비트 대신에 세팅되었다는 것 정도이다. TCP에서 세션을 맺는 과정은 한 가지 방법 밖에 없다. 그렇지만 TCP에서 세션을 끊는 방법은 위의 방법 이 외에 또 다른 방법이 있다. 흔히 이 방법을 4-way handshaking 이라고 한다. 또 다른 말로는 Passive termination 이라고 불린다. 이 방법은 sender가 receiver에게 종료 요청을 보낸 후에도 receiver는 sender에게 계속적으로 데이터를 보낼 수 있다. 다 보낸 후 receiver가 sender에게 FIN 패킷을 전송한다. 아래와 같다.

이제 마지막 한 비트 남았다. RST. Reset이다. 이것은 그다지 어려운 개념이 아니다. 한마디로 연결을 reset하겠다는 것이다. 이는 주로 invalid한 요청 등이 들어왔을 때 혹은 에러가 발생했을 때 보내진다. 즉 연결 자체를 거부하거나 끊어져야만 할 때 사용된다는 뜻이다.


이로서 TCP Flag에 대한 설명은 모두 마쳤다. 정리해보자. SYN은 Connection Establishment에서 사용하고 PSH, URG는 데이터 전송에 사용하고, FIN은 Connection Termination에 사용하는데 각 과정에 대한 응답은 모두 ACK를 통해 이루어진다는 것이다. 마지막으로 에러 혹은 connection refuse 등이 발생할 때는 RST를 통해서 이루어진다.


이제 TCP/IP 포스팅의 거의 마지막에 왔다. 아직까지 설명하지 못한 TCP 헤더의 내용이 있다면 Window size이다. Window size는 앞서 계속 한번씩 언급했지만 딱히 지금까지 다뤄지지 않았다. 다음 포스팅에서 제대로 다뤄볼 생각이다. TCP의 또 다른 Control 능력인 Congestion Control을 통해서 이야기 해보려고 한다. 이 포스팅만 끝나면 드디어 내가 더욱 하고 싶은 Linux Kernel에 대한 포스팅을 시작할 수 있다. 앗싸~

'Computer Networks' 카테고리의 다른 글

[NW] Congestion Control  (12) 2013.10.01
[NW] Flow Control and Error Control  (1) 2013.09.17
[NW] TCP and UDP  (1) 2013.09.02
[NW] Transport Layer  (1) 2013.08.25
[NW] Type of Service (Differentiated Service)  (2) 2013.08.21
Posted by 빛나유
,