Transport Layer(편의상 전송계층)에 대한 host 와 pod 간에 주고받는 데이터를 분석하는 반드시 알고 있어야 하는 부분을 정리했다.
전송 계층은 어찌보면 가장 중요한 계층이라고 하겠다. 실질적인 데이터를 전송과 수신을 담당하기 때문이다. 만일 이런 역할을 하는 전송 계층이 없다면, pod 와 host 간에 누가 먼저 data 를 주고 받을 지 정리가 안되며, host 가 패킷단위의 data transfer 를 할 수 없다. 여기서는 또한 여러가지의 오브젝트들이 있어서, 이 데이터가 어떤 성격을 가지는 것인지 알 수 있다. 데이터를 쪼갤 수 도 있고, 한 뭉치로 만들 수도 있지만, transport connection 을 여러개 만들 때는 Tmore, Tlast 로 Transport data 를 쪼개서 사용하며, 이 쪼개진 TPDU 가 data packet 이 되어 tcid 마다 번갈아 보내진다.
전송 계층도 Link Layer 와 비슷하게 두 가지 형태의 data structure 가 존재한다.
그중에 하나는 C_TPDU 이고 나머지는 R_TPDU 이다. 아래는 C_TPDU 의 스펙이다. 앞에서 c_tpdu_tag, length_field, t_cid 는 헤더부분이다. data field 는 Body 부분이다.
c_tpdu_tag | length_field | t_c_id | data field |
C_TPDU 는 두 부분으로 나뉘는 데, 명령헤더 부분은 tag 의 값, length_field, tcid 로 만들어진다. 또한 body 의 길이는 length_field 의 1을 뺀 길이와 같다.
아래는 R_TPDU 의 스펙이다. r_tpdu_tag, length_field, t_c_id 가 헤더부분이고, data_field 가 Body 부분이다. 나머지는 status 부분이다.
r_tpdu_tag | length_field | t_c_id | data field | SB_tag | length_field = 2 | t_c_id | SB_value |
R_TPDU 는 세 부분으로 나뉘어져 있다.
명령헤더 부분은 r_tpdu_tag, length_field, t_c_id 로 만들어진다. 이 부분은 length_field 에 계산되어지지 않는다.
Body 의 길이는 length_field 의 값에서 1을 뺀 길이와 같다.
Status 는 status tag 인 SB_tag 와 length_field 의 값은 2이고, t_c_id 와 1바이트의 SB_value 로 이루어져 있다. SB_value(Status Byte value) 는 아래의 표와 같다.
bit8 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 |
DA | reserved | | | | | | |
bit8 | 내용 |
0 | no message available |
1 | message available |
위의 표를 보고 분석하면 되겠다. 이제 전송 계층에서 사용하는 오브젝트 Tag 들을 살펴보자.
Tag 이름 | Tag value | 방향 | 설명 |
Tsb | 80 | POD → HOST | 데이터를 다 받으면 POD 가 HOST 로 보내는 신호 |
Trcv | 81 | HOST → POD | POD 가 보낸 데이터에 대해 응답하는 신호 |
Tcreate_t_c | 82 | HOST → POD | 가장 먼저 전송계층의 연결을 만드는 신호 |
Tc_t_c_reply | 83 | POD → HOST | HOST 가 보낸 데이터에 대한 POD 의 응답 신호로서 HOST 는 데이터를 보내거나, 똑같이 Trcv 신호를 보낸다. |
Tdelete_t_c | 84 | POD ↔ HOST | POD 로 부터 오는 데이터를 파싱해서 이 신호가 추출되면, POD로 D_T_C_REPLY 신호를 보내고, 접속을 끊는다. |
Td_t_c_reply | 85 | POD ↔ HOST | POD 로 부터 오는 데이터를 파싱해서 이 신호가 추출되면, 바로 연결을 끊는다. |
Trequest_t_c | 86 | POD → HOST | 사용하지 않음 |
Tnew_t_c | 87 | HOST → POD | 사용하지 않음 |
Tt_c_error | 88 | HOST → POD | 사용하지 않음 |
Tdata_last | A0 | HOST ↔ POD | TPDU를 만들 때는 마지막에 데이터의 마지막을 알리기위해 첨가한다. 파싱을 할 때 이 신호가 온다면, 전체 데이터가 모두 왔다는 것이므로 데이터를 취합해서 상위 세션 계층으로 보낸다. |
Tdata_more | A1 | HOST ↔ POD | 파싱할 때 이 신호가 온다면, Sb_value 를 확인해서 1 이면 Trcv 응답 신호를 보내고 0 이면, Tdata_last 로 보내서 마지막 데이터인지 확인한다. |
위에 표를 보면, 사용하는 Tag 가 있는 반면에 사용하지 않는 Tag 가 있다. 각각의 Tag 들은 조금씩 structure 가 다르다. 이번에는 하나씩 Tag 의 structure 를 알아보자.
create_T_C_tag | length_field | t_c_id |
C_T_C_Reply_tag | length_field | t_c_id |
delete_T_C_tag | length_field | t_c_id |
d_T_C_Reply_tag | length_field | t_c_id |
request_T_C_tag | length_field | t_c_id |
예를 들어서, 가정 먼저 나온 데이터는 아래와 같다.
wirte_value = 108211
여기서 82 라는 것은 Object Tag 이다. 다음에 나오는 1은 length_field 의 값이다. 마지막에 나오는 1 은 t_c_id 이다.