<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Home on Chaitanya&#39;s Website</title>
        <link>https://www.securecommand.uk/</link>
        <description>Recent content in Home on Chaitanya&#39;s Website</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-gb</language>
        <lastBuildDate>Sun, 25 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.securecommand.uk/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>Reliable Transmission</title>
            <link>https://www.securecommand.uk/articles/reliable-transmission/</link>
            <pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
            <guid>https://www.securecommand.uk/articles/reliable-transmission/</guid>
            <description>&lt;img src=&#34;https://www.securecommand.uk/assets/reliable-transmission.svg&#34; alt=&#34;Featured image of post Reliable Transmission&#34; /&gt;&lt;h2 id=&#34;reliable-transmission-briefly&#34;&gt;&lt;a href=&#34;#reliable-transmission-briefly&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Reliable Transmission: Briefly&#xA;&lt;/h2&gt;&lt;p&gt;Reliable Transmission is a service usually provided by the transport layer, although occasionally available at the link-layer; it concerns itself with the reliable delivery of data from one host to another, either over a direct link or over an internetwork (like the Internet).&lt;/p&gt;&#xA;&lt;p&gt;Reliable Transmission is a vital for applications that need to delivery all data as accurately as possible over an unreliable network, with little or no requirements for speed, examples include: File Transfer, Messaging applications or Email.&lt;/p&gt;&#xA;&lt;p&gt;In the following sections we will explore the fundamental building blocks for any protocol implementing reliable transmission, how reliable transmission is implemented in the real world and where reliable transmission is heading in modern protocols such as QUIC, which do not follow the traditional ideas of a reliable delivery service.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-building-blocks-for-reliable-transmission&#34;&gt;&lt;a href=&#34;#the-building-blocks-for-reliable-transmission&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;The Building Blocks for Reliable Transmission&#xA;&lt;/h2&gt;&lt;p&gt;Before we establish the building blocks for Reliable Transmission we need to understand why we even need reliable transmission, To explore this consider the following scenario:&lt;/p&gt;&#xA;&lt;blockquote class=&#34;alert alert-important&#34;&gt;&#xA;        &lt;div class=&#34;alert-header&#34;&gt;&#xA;            &lt;span class=&#34;alert-icon&#34;&gt;📌&lt;/span&gt;&#xA;            &lt;span class=&#34;alert-title&#34;&gt;Scenario&lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div class=&#34;alert-body&#34;&gt;&#xA;            &lt;p&gt;A sender is transmitting some data to the receiver, the sender is sequentially data over the network, there is neither re-transmission of packets, nor sequencing information attached to the packets.&#xA;Since the packets may take different routes over the network to arrive to the host the packets are more likely to arrive out of order than in order, as the receiver receives the information, it has no way of knowing how to order the packets or if it has all the data that was transmitted, this will obviously confuse the receiver and possibly the application it is serving, leading to poor formation of data and degraded user experience.&lt;/p&gt;&#xA;        &lt;/div&gt;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;This is where Reliable Transmission comes in, to solve this exact problem&lt;/p&gt;&#xA;&lt;p&gt;Reliable Transmission is implemented using the following concepts:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Acknowledgements: Sent by the receiver to the sender acknowledging the information has arrived&lt;/li&gt;&#xA;&lt;li&gt;Sequencing: Information added to the packet that denotes how the data should be sequenced.&lt;/li&gt;&#xA;&lt;li&gt;Re-transmission: Re-sending data that the receiver has not acknowledged, Usually after a timer has expired&lt;/li&gt;&#xA;&lt;li&gt;Timers: Used to time how long the receiver takes to send an acknowledgement&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;the-2-ways-to-implement-reliable-transmission&#34;&gt;&lt;a href=&#34;#the-2-ways-to-implement-reliable-transmission&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;The 2 Ways to implement Reliable Transmission&#xA;&lt;/h2&gt;&lt;p&gt;In this section, We&amp;rsquo;ll explore two different reliable transmission algorithms which have been historically significant or are being used in modern implementations of such protocols&lt;/p&gt;&#xA;&lt;h3 id=&#34;stop-and-wait-algorithm&#34;&gt;&lt;a href=&#34;#stop-and-wait-algorithm&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Stop and Wait Algorithm&#xA;&lt;/h3&gt;&lt;p&gt;Stop and Wait is quite a simple algorithm, the sender sends a single data segment to the receiver and waits for the receiver to send an acknowledgement, If the user does not send an acknowledgement to the sender then after a certain amount of time the sender re-transmits the segment, this process continues until the receiver receives all segments.&lt;/p&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;  &lt;img src=&#34;https://www.securecommand.uk/assets/stop-and-wait.svg&#34; alt=&#34;Stop and Wait Algorithm&#34;/&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;As seen in the diagram, stop and wait ensures that the data arrives at the receiver, however, the algorithm has a major drawback, it acts as a bottleneck for the entire transmission, halting the transmission of further segments until an acknowledgement is received is just not viable for any network, therefore, as a solution the Sliding Window Algorithm was developed which we study next.&lt;/p&gt;&#xA;&lt;h3 id=&#34;sliding-window-algorithm&#34;&gt;&lt;a href=&#34;#sliding-window-algorithm&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Sliding Window Algorithm&#xA;&lt;/h3&gt;&lt;p&gt;The sliding window algorithm is more sophisticated approach to reliable transmission, it features a sliding window on both the sender and receiver, the sliding windows maintain 3 different variables: Last Byte Written / Read, Last Byte Sent / Received and Window Size.&lt;/p&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;  &lt;img src=&#34;https://www.securecommand.uk/assets/sliding-window-window.svg&#34; alt=&#34;Sliding Window&#34;/&gt;&#xA;  &lt;sub&gt;The Sliding Window; Bytes can be buffered until they are read so the sender can send as many bytes as the window permits&lt;/sub&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;The sender can transmit as many bytes (as a collective, inside a segment to maintain efficiency) as the receiver&amp;rsquo;s window size permits, the receiver acknowledges all the segments it receives, usually as a cumulative to avoid sending multiple acknowledgements.&lt;/p&gt;&#xA;&lt;p&gt;If any of the bytes do not arrive then the receiver does not send an acknowledgement for those bytes and after a certain amount of time the sender re-transmits those bytes, additionally, if the receiver receives successive bytes before receiving bytes for an earlier sequence number then they can choose to selectively acknowledge certain bytes to let the sender know that they do not need to re-transmit all the byte collections sequenced after the missing byte collection.&lt;/p&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;  &lt;img src=&#34;https://www.securecommand.uk/assets/sliding-window.svg&#34; alt=&#34;Sliding Window over Time graph&#34;/&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;should-reliable-transmission-be-implemented-at-the-link-layer&#34;&gt;&lt;a href=&#34;#should-reliable-transmission-be-implemented-at-the-link-layer&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Should Reliable Transmission be implemented at the Link-Layer&#xA;&lt;/h2&gt;&lt;p&gt;One of the heaviest points of debate among computer networking scientists is whether reliable transmission should be implemented at the link layer or the transport layer, I will briefly explore both sides of the argument.&lt;/p&gt;&#xA;&lt;p&gt;Reliable Delivery at the link-layer will be a violation to the end-to-end principle, which states that several functions such as validating correctness, security and reliability should happen at the end hosts to ensure the spanning layer stays as simple and scaleable as possible, additionally, if the link-layer implements reliable transmission than it may unnecessarily harm the performance of applications that do not require reliable transmissions such as real time time video calling applications.&lt;/p&gt;&#xA;&lt;p&gt;However, ensuring reliability can ensure that issues involving transmission failures get addressed as early as possible, this can maximise the efficiency of the network.&lt;/p&gt;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;&lt;a href=&#34;#conclusion&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Conclusion&#xA;&lt;/h2&gt;&lt;p&gt;In this article we examined why we need reliable transmission, how reliable transmission can be implemented, two prominent algorithms in reliable transmission and whether reliable transmission should be implemented at the link layer.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Understanding DHCP</title>
            <link>https://www.securecommand.uk/articles/understanding-dhcp/</link>
            <pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate>
            <guid>https://www.securecommand.uk/articles/understanding-dhcp/</guid>
            <description>&lt;img src=&#34;https://www.securecommand.uk/assets/dhcp-banner.svg&#34; alt=&#34;Featured image of post Understanding DHCP&#34; /&gt;&lt;h2 id=&#34;what-is-dhcp---dynamic-host-configuration-protocol&#34;&gt;&lt;a href=&#34;#what-is-dhcp---dynamic-host-configuration-protocol&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;What is DHCP - Dynamic Host Configuration Protocol?&#xA;&lt;/h2&gt;&lt;p&gt;Dynamic Host Configuration Protocol or abbreviated to DHCP is an application layer protocol built on the client-server model, it allows network administrators to automate the allocation of IP address and dynamically deliver other configurations parameters: such as the default gateway.&lt;/p&gt;&#xA;&lt;p&gt;Goals DHCP aims to accomplish include:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;DHCP Clients should require no manual configuration from the client user, the client should be able to discover and apply configurations from a DHCP server.&lt;/li&gt;&#xA;&lt;li&gt;DHCP must not require a server on each subnet, DHCP should work through routers or using a relay agent.&lt;/li&gt;&#xA;&lt;li&gt;DHCP must coexist with statically configured, non-participating host and with existing network protocol implementations&lt;/li&gt;&#xA;&lt;li&gt;DHCP must be compatible with BOOTP (a legacy protocol with a similar purpose; the differences may be explored in a future post) and hosts that rely on BOOTP for their configuration parameters.&lt;/li&gt;&#xA;&lt;li&gt;DHCP must retain client configurations in the event of a client or server reboot, and whenever possible, should assign the same configuration parameters as it had done before the reboot.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;how-does-dhcp-work&#34;&gt;&lt;a href=&#34;#how-does-dhcp-work&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;How does DHCP work?&#xA;&lt;/h2&gt;&lt;p&gt;As mentioned earlier, DHCP operates on the client-server model, the server maintains a pool of IP addresses which it is able to allocate to hosts on the network and the established clients send a request to the DHCP server requesting for configuration parameters (such as IP addresses and default gateways).&lt;/p&gt;&#xA;&lt;p&gt;On the other hand, new client on the network send a broadcast (DHCPDISCOVER) query on the network, DHCP servers on the network then respond to this broadcast request and establish themselves as a DHCP server to the client (DHCPOFFER), the client then may choose to request configuration parameters (DHCPREQUEST) which the server than provides as response (DHCPACK).&lt;/p&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;    &lt;img src=&#34;https://www.securecommand.uk/assets/dhcp-scenario.jpg&#34; alt=&#34;A diagram depicting the process described above&#34;/&gt;&#xA;  &lt;sub&gt; A diagram depicting how a new host on the network can get their IP address from the DHCP server &lt;/sub&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;An important fact to note is that most of the time, when an IP address is allocated to a host it is leased and thus not permanent, this is especially helpful when some nodes may only temporarily use the network (this is most common on wireless networks).&lt;/p&gt;&#xA;&lt;p&gt;To ensure clients receive the same configuration parameters post-outages or reboot, DHCP servers reserves the client&amp;rsquo;s configuration parameters for the duration of the client&amp;rsquo;s lease. When the client returns online and requests for the DHCP information again, the DHCP server can reply with the same configuration parameters.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-was-dhcp-not-decentralised&#34;&gt;&lt;a href=&#34;#why-was-dhcp-not-decentralised&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Why was DHCP not decentralised?&#xA;&lt;/h2&gt;&lt;p&gt;A decentralised DHCP may have had higher performance or offer better reliability but there were two major reasons why DHCP ended up being a centralised protocol, those reasons are:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Administrative Load: A centralised server is far easier to administer and control than hundreds of nodes negotiating IP addresses themselves and configuration parameters themselves.&lt;/li&gt;&#xA;&lt;li&gt;Nodes would have needed to defend their IP address: DHCP having a central authority manage the pool of IP addresses ensures that the server will not hand out the same IP addresses to multiple hosts, without a central authority, nodes would have needed a mechanism to defend their IP addresses, which would transform computer networks into the wild west.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;&lt;a href=&#34;#conclusion&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Conclusion&#xA;&lt;/h2&gt;&lt;p&gt;In this post, we understood what DHCP is, How it functions and why it wasn&amp;rsquo;t decentralised, I hope you enjoyed reading this post as much as I enjoyed writing it, hope you have a great day ahead!&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>How to Calculate IPv4 Subnet Information Fast!</title>
            <link>https://www.securecommand.uk/articles/subnetting-fast/</link>
            <pubDate>Tue, 29 Sep 2026 00:00:00 +0000</pubDate>
            <guid>https://www.securecommand.uk/articles/subnetting-fast/</guid>
            <description>&lt;img src=&#34;https://www.securecommand.uk/assets/subnetting-banner.svg&#34; alt=&#34;Featured image of post How to Calculate IPv4 Subnet Information Fast!&#34; /&gt;&lt;h2 id=&#34;what-is-subnetting&#34;&gt;&lt;a href=&#34;#what-is-subnetting&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;What is Subnetting?&#xA;&lt;/h2&gt;&lt;p&gt;Subnetting refers to the process of dividing an IP network address space into smaller logical networks by &amp;ldquo;borrowing&amp;rdquo; bits from the host segment of the IP address;&#xA;It enhances security and performance as node communication and broadcast messages are limited to that subnet, It also ensures address space is used efficiently.&lt;/p&gt;&#xA;&lt;h2 id=&#34;calculate-subnet-information&#34;&gt;&lt;a href=&#34;#calculate-subnet-information&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Calculate Subnet Information&#xA;&lt;/h2&gt;&lt;p&gt;There are 4 key pieces of information we need to calculate about a subnet; the network address, the broadcast address, the host address range and the network address for the next subnet.&lt;/p&gt;&#xA;&lt;p&gt;We will calculate the subnet network address information from a node&amp;rsquo;s IP address &amp;amp; subnet Mask; The first IP address we will be using is 192.168.1.2 with the subnet mask of 255.255.255.0 (or written in CIDR notation as /24, I will talk about CIDR in a different blog post)&lt;/p&gt;&#xA;&lt;h3 id=&#34;calculating-the-subnet-network-address&#34;&gt;&lt;a href=&#34;#calculating-the-subnet-network-address&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Calculating the Subnet Network Address&#xA;&lt;/h3&gt;&lt;p&gt;This one&amp;rsquo;s quite simple; simply perform a BITWISE AND operation (If the top &amp;amp; bottom values are the same; write them as is, otherwise write them as a 0) on the node&amp;rsquo;s IP address and the subnet mask, In our case it would look like this;&lt;/p&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;  &lt;img src=&#34;https://www.securecommand.uk/assets/networksection.png&#34; alt=&#34;Calculating subnet network address&#34;/&gt;&#xA;  &lt;sub&gt;A BITWISE AND on 192.168.1.2 and 255.255.255.0 &lt;/sub&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Converting &lt;code&gt;11000000.10101000.00000001.00000000&lt;/code&gt; into decimal notation gives us 192.168.1.0; Voila! There&amp;rsquo;s our network address, To make this process even faster you can choose to ignore the network portion of the address (the octets denoted with a &amp;ldquo;full&amp;rdquo; subnet mask) and focus entirely on the host section.&lt;/p&gt;&#xA;&lt;h3 id=&#34;calculating-the-subnet-broadcast-address&#34;&gt;&lt;a href=&#34;#calculating-the-subnet-broadcast-address&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Calculating the Subnet Broadcast Address&#xA;&lt;/h3&gt;&lt;p&gt;Now that we have the network section of the subnet it is extremely easy to calculate the broadcast address, simply write all host bits as a 1 and ignore the network section, in the case of our example the subnet broadcast address would be 192.168.1.255!&lt;/p&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;  &lt;img src=&#34;https://www.securecommand.uk/assets/broadcast.png&#34; alt=&#34;Calculating Broadcast Address&#34;/&gt;&#xA;  &lt;sub&gt;Flip the host section 0s into 1s &lt;/sub&gt;&#xA;&lt;/p&gt;&#xA;&lt;h3 id=&#34;calculating-the-subnet-host-range&#34;&gt;&lt;a href=&#34;#calculating-the-subnet-host-range&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Calculating the Subnet Host Range&#xA;&lt;/h3&gt;&lt;p&gt;Now that we have the subnet network address and the subnet broadcast address, it really only gets easier from here: The IP of the first host will be the &lt;code&gt;network address + 1&lt;/code&gt; in our case: 192.168.1.1 and the IP of the last host will be the &lt;code&gt;broadcast address -1&lt;/code&gt; in our case: 192.168.1.254.&#xA;So the host range is 192.168.1.1 through 192.168.1.254, inclusive&lt;/p&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;  &lt;img src=&#34;https://www.securecommand.uk/assets/range.png&#34; alt=&#34;IP address range&#34;/&gt;&#xA;  &lt;sub&gt;The IP address of the First and Last Host &lt;/sub&gt;&#xA;&lt;/p&gt;&#xA;&lt;h3 id=&#34;calculating-the-next-subnets-network-address&#34;&gt;&lt;a href=&#34;#calculating-the-next-subnets-network-address&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Calculating the Next Subnet&amp;rsquo;s Network Address&#xA;&lt;/h3&gt;&lt;p&gt;The final bit of information we need, this (like all those before) is also incredibly easy, simply &lt;code&gt;network address of current subnet + 256&lt;/code&gt;  to calculate the network address of the next section; in our example that would equal to 192.168.2.0&lt;/p&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;  &lt;img src=&#34;https://www.securecommand.uk/assets/next-subnet.png&#34; alt=&#34;Network address of next subnet&#34;/&gt;&#xA;  &lt;sub&gt; Network Address + 256 = next subnet&#39;s network address &lt;/sub&gt;&#xA;&lt;/p&gt;&#xA;&lt;h3 id=&#34;everything-tied-together&#34;&gt;&lt;a href=&#34;#everything-tied-together&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Everything tied together&#xA;&lt;/h3&gt;&lt;p&gt;I hope you enjoyed learning about this method almost as much as I did, while it is simple I would urge you to practice more subnetting questions using this technique, &lt;a class=&#34;link&#34; href=&#34;https://subnetipv4.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://subnetipv4.com/&lt;/a&gt; is a very intuitive website to practice subnetting&lt;/p&gt;&#xA;&lt;p&gt;Finally, Here&amp;rsquo;s all the information tied together, Have a great day ahead!&lt;/p&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;  &lt;img src=&#34;https://www.securecommand.uk/assets/tied-together.png&#34; alt=&#34;All the information tied together&#34;/&gt;&#xA;  &lt;sub&gt; All the Information tied together &lt;/sub&gt;&#xA;&lt;/p&gt;</description>
        </item><item>
            <title>Explaining Random Access Protocols</title>
            <link>https://www.securecommand.uk/articles/explaining-random-access-protocols/</link>
            <pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate>
            <guid>https://www.securecommand.uk/articles/explaining-random-access-protocols/</guid>
            <description>&lt;img src=&#34;https://www.securecommand.uk/assets/random-access-banner.svg&#34; alt=&#34;Featured image of post Explaining Random Access Protocols&#34; /&gt;&lt;h2 id=&#34;what-is-a-multi-access-computer-network&#34;&gt;&lt;a href=&#34;#what-is-a-multi-access-computer-network&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;What is a Multi-Access Computer Network&#xA;&lt;/h2&gt;&lt;p&gt;A Multi-Access Network allows for multiple nodes to transmit data (send data) over a shared communication medium, such as a cable or radio waves.&lt;/p&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;  &lt;img src=&#34;https://www.securecommand.uk/assets/Nodes Sharing Link.png&#34; alt=&#34;Image of Nodes sharing a link&#34; title=&#34;Nodes sharing a link&#34;/&gt;&#xA;  &lt;sub&gt;Image of Nodes sharing a common link&lt;/sub&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;These types of networks are generally more cost-effective compared to other types of networks such as those that rely on a central node to forward traffic (like a switch) or networks that offer direct links between each of the hosts, So an approach that relies on neither a central node nor direct links can save an organisation quite a lot of money!&lt;/p&gt;&#xA;&lt;p&gt;There are three major categories of Multi-Access Network Protocols:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Random Access Protocols&lt;/li&gt;&#xA;&lt;li&gt;Controlled Access Protocols&lt;/li&gt;&#xA;&lt;li&gt;Channelised Access Protocols&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Each of these protocols have different methods of controlling access between nodes and all of these protocols have certain advantages and disadvantages.&lt;/p&gt;&#xA;&lt;p&gt;However, for this blog post I will only be considering the Random Access Protocols, as they serve as great examples.&lt;/p&gt;&#xA;&lt;h2 id=&#34;random-access-protocols&#34;&gt;&lt;a href=&#34;#random-access-protocols&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Random Access Protocols&#xA;&lt;/h2&gt;&lt;p&gt;Random Access Protocols are designed with a simple goal in mind; no node has control over another node, this means that there is no central authority that governs the transmissions, instead the nodes compete with each other to access the medium, therefore the transmission is random (truly earns its name don&amp;rsquo;t you think).&lt;/p&gt;&#xA;&lt;p&gt;The 4 major media access control algorithms classified as random access protocols are:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Pure ALOHA (1970s)&lt;/li&gt;&#xA;&lt;li&gt;Slotted Aloha (1970s)&lt;/li&gt;&#xA;&lt;li&gt;CSMA/CD (Carrier Sense Multi-Access / Collision Detect) (1980s)&lt;/li&gt;&#xA;&lt;li&gt;CSMA/CA (Carrier Sense Multi-Access / Collision Avoidance) (1990s)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;pure-aloha&#34;&gt;&lt;a href=&#34;#pure-aloha&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Pure ALOHA&#xA;&lt;/h3&gt;&lt;p&gt;One of the earliest methods for media access control, Pure ALOHA was developed by the University of Hawaii for the ALOHAnet (A wireless LAN) to prevent collisions from happening between nodes transmitting at the same time. Pure ALOHA utilises a simple approach to reduce the number of collisions; It requires all nodes to wait a random amount of time, if one of their previous frames (a data unit sent at the link layer) has collided with another frame.&lt;/p&gt;&#xA;&lt;p&gt;However, this only reduces the rate of collisions and that too insignificantly, making the Pure ALOHA approach impractical for larger networks.&lt;/p&gt;&#xA;&lt;h3 id=&#34;slotted-aloha&#34;&gt;&lt;a href=&#34;#slotted-aloha&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Slotted ALOHA&#xA;&lt;/h3&gt;&lt;p&gt;To address Pure ALOHA&amp;rsquo;s Shortcomings, Slotted ALOHA was developed as an Improvement, It divides time into slots with each slot being long enough to transmit exactly one frame, therefore if a node fails to transmit frames during the first slot it must wait until the next slot to begin transmitting again.&lt;/p&gt;&#xA;&lt;p&gt;This approach makes slotted ALOHA twice as effective at preventing collisions compared to Pure ALOHA, However, It still is not as efficient as the protocols we will discuss next!&lt;/p&gt;&#xA;&lt;h3 id=&#34;csmacd--csmaca&#34;&gt;&lt;a href=&#34;#csmacd--csmaca&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;CSMA/CD &amp;amp; CSMA/CA&#xA;&lt;/h3&gt;&lt;p&gt;CSMA/CD &amp;amp; CSMA/CA are two of the most well known multi-access network protocols, known for their historical impact and most importantly their application in network engineering courses.&lt;/p&gt;&#xA;&lt;p&gt;We start by explaining the CSMA technology both share; CSMA stands for Carrier Sense Multi-Access which means that nodes can distinguish when a link is idle or busy, If a link is idle, CSMA transmits instantly, if a link is busy then CSMA waits before transmitting, this can still lead to collisions as two or more nodes may find the link to be idle at the same time and frames may collide, this is where CD &amp;amp; CA come in!&lt;/p&gt;&#xA;&lt;h3 id=&#34;collision-detect-with-ethernet&#34;&gt;&lt;a href=&#34;#collision-detect-with-ethernet&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Collision Detect with Ethernet&#xA;&lt;/h3&gt;&lt;p&gt;Carrier Sense Multi-Access / Collision Detect was primarily used by Shared Ethernet links (802.3) to transmit frames over a shared link (historically Coax), An important feature of the Ethernet implementation of CSMA is that it is a 1-Persistent protocol, which means that nodes continuously check if the link is idle or busy.&lt;/p&gt;&#xA;&lt;p&gt;The CSMA technology as defined above is deployed alongside Collision Detect (CD), which allows nodes to detect when collisions occur, addressing this limitation of CSMA!.&lt;/p&gt;&#xA;&lt;p&gt;Once the frames collide the two nodes involved perform post-collision actions, in Ethernet&amp;rsquo;s case the nodes send a jamming sequence and stop transmission of all further frames. the adaptor nodes then wait a random amount of time before attempting to transmit again, if it fails again it waits exponentially longer (an exponential backoff), nodes try a specific number of times before giving up and reporting an error to the host node.&lt;/p&gt;&#xA;&lt;p&gt;A lovely interactive animation that depicts CSMA/CD can be found at Computer Networking: A Top Down Approach&amp;rsquo;s website; &lt;a class=&#34;link&#34; href=&#34;https://gaia.cs.umass.edu/kurose_ross/animations.php&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://gaia.cs.umass.edu/kurose_ross/animations.php&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here is an additional Flowchart;&lt;/p&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;  &lt;img src=&#34;https://www.securecommand.uk/assets/Ethernet Flowchart.png&#34; alt=&#34;Ethernet Flowchart&#34; title=&#34;Flowchart&#34; style=&#34;width: 125%; height: 125%;&#34;/&gt;&#xA;  &lt;sub&gt;A Flowchart depicting the flow of the Ethernet protocol&lt;/sub&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;CSMA/CD has since been phased out in favour of Switched Ethernet, that relies on a central node which a node has a direct connection to using an Ethernet cable, despite this; CSMA/CD serves as a valuable concept to explain multi-access networks to aspiring network engineers.&lt;/p&gt;&#xA;&lt;h3 id=&#34;collision-avoidance-with-wi-fi&#34;&gt;&lt;a href=&#34;#collision-avoidance-with-wi-fi&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Collision Avoidance with Wi-Fi&#xA;&lt;/h3&gt;&lt;p&gt;Now we talk about CSMA/CA, the sister technology to CSMA/CD; CSMA/CA stands for Carrier Sense Multi-Access with Collision Avoidance and It is used to reduce the rate of collisions on Wireless networks, more specifically Wi-Fi (802.11) (and unlike its sibling technology, it is still used today)&lt;/p&gt;&#xA;&lt;p&gt;Before we begin exploring CSMA/CA we must address the two unique problems that are encountered by wireless transfer;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The Exposed Node Problem: Where a Node can hear the transmission of another node (even though the transmissions do not interfere), this can prevent a node from transmitting as it may incorrectly assume the transmissions from both nodes would collide.&lt;/li&gt;&#xA;&lt;li&gt;The Hidden Node Problem: When two nodes that are hidden from each other communicate with another node between them, they may cause collisions as neither of them are able to detect each other&amp;rsquo;s transmissions, therefore neither of them will be able to detect the collision either, leading to a large number of collisions.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;  &lt;img src=&#34;https://www.securecommand.uk/assets/CSMACA Problems addressed.png&#34; alt=&#34;Exposed &amp; Hidden Node Problems&#34; title=&#34;Exposed &amp; Hidden Node Problems&#34; style=&#34;width: 125%; height: 125%;&#34;/&gt;&#xA;  &lt;sub&gt;A Graphic depicting both the problems&lt;/sub&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;To address the exposed node problem, CSMA/CA checks if a node can hear communications from another node, if it cannot then the node can freely transmit, if it can, it waits for the transmission to end. (how does this solve the problem)&lt;/p&gt;&#xA;&lt;p&gt;To circumvent the hidden node problem, Wi-Fi  expects an explicit Acknowledgement (An ACK) from the receiver, A receiver only sends an ACK if the frame arrives and passes the CRC (A Cyclic redundancy check; the details warrant another blog post :), for now It is just an error check), if the ACK is not transmitted the sender re-transmits the frame, this doesn&amp;rsquo;t entirely avoid collisions but ensures the data does end up arriving.&lt;/p&gt;&#xA;&lt;p&gt;Another approach that addresses both the Hidden Node and Exposed Node problem is RTS-CTS frames,&lt;/p&gt;&#xA;&lt;p&gt;While, the RTS-CTS frames are optional to implement for the 802.11 / Wi-Fi standard, they effectively solve both the problems, The Flow can be described as;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The sender transmits a small packet called the RTS (Ready-To-Send) to the receiver,&lt;/li&gt;&#xA;&lt;li&gt;if the RTS arrives and the receiver is willing to receive further frames from the sender, then the receiver sends a CTS (Clear-To-Send) frame,&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;This can effectively counter the hidden node problem as a hidden node that might not hear the RTS may hear the CTS, effectively telling it to stop transmitting for a set amount of time.&#xA;It can also effectively counter the exposed node problem, as a node that hears the RTS but not the CTS can successfully determine that the communication will not collide and that exposed node can transmit frames to other nodes.&lt;/p&gt;&#xA;&lt;p&gt;A diagram depicting the RTS-CTS flow:&lt;/p&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA;  &lt;img src=&#34;https://www.securecommand.uk/assets/RTS-CTS.png&#34; alt=&#34;RTS-CTS&#34; title=&#34;RTS-CTS&#34; style=&#34;width: 55%; height: 55%;&#34;/&gt;&#xA;  &lt;sub&gt;A diagram depicting the RTS-CTS flow&lt;/sub&gt;&#xA;&lt;/p&gt;&#xA;&lt;h3 id=&#34;conclusion&#34;&gt;&lt;a href=&#34;#conclusion&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Conclusion&#xA;&lt;/h3&gt;&lt;p&gt;In this Post, We explored the legacy Pure ALOHA, Slotted ALOHA &amp;amp; CSMA/CD technologies, diving into how they function in acceptable detail, We also explored current technologies such as CSMA/CA and how it attempts to solve the exposed node &amp;amp; hidden node problems allowing wireless transmissions to avoid collision.&lt;/p&gt;&#xA;&lt;p&gt;I hope you enjoyed reading this blog post as much as I enjoyed writing it (A lot!), hope you have a great day ahead!&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>go-nvd - An Unoffical API Wrapper for nvd.nist.gov APIs</title>
            <link>https://www.securecommand.uk/projects/go-nvd/</link>
            <pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
            <guid>https://www.securecommand.uk/projects/go-nvd/</guid>
            <description>&lt;img src=&#34;https://www.securecommand.uk/assets/gonvd-banner.svg&#34; alt=&#34;Featured image of post go-nvd - An Unoffical API Wrapper for nvd.nist.gov APIs&#34; /&gt;&lt;h2 id=&#34;project-overview&#34;&gt;&lt;a href=&#34;#project-overview&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Project Overview&#xA;&lt;/h2&gt;&lt;h3 id=&#34;what-is-go-nvd&#34;&gt;&lt;a href=&#34;#what-is-go-nvd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;What is go-nvd?&#xA;&lt;/h3&gt;&lt;p&gt;go-nvd is an unofficial API wrapper for interacting with the nvd.nist.gov REST APIs.&#xA;The main appeal of the project is the declarative programming style it enables using &lt;code&gt;WithFunctions&lt;/code&gt; and an easy to configure client enables the developer to interact with the NVD without contributing to code complexity.&#xA;This reduces noise and allows developers to focus entirely on how they analyse, modify or otherwise process the response data.&#xA;As an Example, the code to request for 300 CVEs can be as simple and concise as:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;codeberg.org/chillygopher/go-nvd&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;codeberg.org/chillygopher/go-nvd/cve&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// main fetches a total of 300 CVEs using the resultsPerPage Parameter&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cve&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;gonvd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WithAPIKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;INSERT-API-KEY&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;FilteredFetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cve&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WithResultsPerPage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// handle error&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// use resp as required&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;api-coverage&#34;&gt;&lt;a href=&#34;#api-coverage&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;API Coverage&#xA;&lt;/h3&gt;&lt;p&gt;go-nvd fully supports interacting with both the CVE and CVE History API (and also the Feeds API, but the support for it is rather experimental), with wrappers for the other APIs on their way as the library matures and grows.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-design-philosophy---levering-functional-options&#34;&gt;&lt;a href=&#34;#the-design-philosophy---levering-functional-options&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;The Design Philosophy - Levering Functional Options&#xA;&lt;/h2&gt;&lt;h3 id=&#34;overview&#34;&gt;&lt;a href=&#34;#overview&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Overview&#xA;&lt;/h3&gt;&lt;p&gt;The design philosophy for the go-nvd API revolves heavily around the Client which is used to interact with their respective NVD REST API endpoint, Each Client exposes a handful of helper methods for that specific API Endpoint and more importantly the FilteredFetch Method, Below is the FilteredFetch Method implemented by the cveClient;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cveClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;FilteredFetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;opts&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;FilterOpts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ResponseType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;fetching-the-information&#34;&gt;&lt;a href=&#34;#fetching-the-information&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Fetching the Information&#xA;&lt;/h3&gt;&lt;p&gt;To fetch the information, the User should primarily use the FilteredFetch method.&#xA;The method expects the user to enter a variable number of types that satisfy the FilterOpts Interface (An Interface can simply be considered as a contract for types, If the types implement the methods for that interface than the type is said to satisfy that Interface).&lt;/p&gt;&#xA;&lt;p&gt;This method follows the &lt;em&gt;Functional Options&lt;/em&gt; design pattern as defined by the Style guide developed by Uber (Find the Entire Guide &lt;a class=&#34;link&#34; href=&#34;https://github.com/uber-go/guide/blob/master/style.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Here&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Functional Options as defined by the Style guide;&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Functional options is a pattern in which you declare an opaque &lt;code&gt;Option&lt;/code&gt; type that records information in some internal struct. You accept a variadic number of these options and act upon the full information recorded by the options on the internal struct.&lt;/p&gt;&#xA;&lt;p&gt;Use this pattern for optional arguments in constructors and other public APIs that you foresee needing to expand, especially if you already have three or more arguments on those functions.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;The FilterOpts Interface is;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;FilterOpts&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&#x9;&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;apply&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;vals&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Values&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;This enables users to add a variadic number of parameters to their request, which is then applied to the query URL, enabling users to form URL-encoded queries such as;&#xA;&lt;code&gt;https://services.nvd.nist.gov/rest/json/cves/2.0?resultsPerPage=300&lt;/code&gt;&#xA;using the function call;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;FilteredFetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cve&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WithResultsPerPage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;300&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;All the parameters for the CVE and CVE History REST APIs are supported, read either the package specification on &lt;a class=&#34;link&#34; href=&#34;https://pkg.go.dev/codeberg.org/chillygopher/go-nvd&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://pkg.go.dev/codeberg.org/chillygopher/go-nvd&lt;/a&gt; or read the API references on the NVD website &lt;a class=&#34;link&#34; href=&#34;https://nvd.nist.gov/developers&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://nvd.nist.gov/developers&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;configuring-the-client&#34;&gt;&lt;a href=&#34;#configuring-the-client&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Configuring the Client&#xA;&lt;/h3&gt;&lt;p&gt;A Client can also be configured using a similar approach, A constructor function for a CVE Client is shown below;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;NewClient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;opts&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;gonvd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ClientOption&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;cveClient&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;Possible Configurations allow the client to;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Retry requests when rate limited&lt;/li&gt;&#xA;&lt;li&gt;Apply an API key&lt;/li&gt;&#xA;&lt;li&gt;Apply a Timeout&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;challenges&#34;&gt;&lt;a href=&#34;#challenges&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;Challenges&#xA;&lt;/h2&gt;&lt;p&gt;Similarly to most projects, go-nvd has had its fair share of challenges and obstacles, I will briefly mention some of the more prominent challenges I encountered and the solutions I employed.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-retry-riddle&#34;&gt;&lt;a href=&#34;#the-retry-riddle&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;The Retry Riddle&#xA;&lt;/h3&gt;&lt;p&gt;Originally, While Implementing the Retry functionality to retry after being rate limited, I initially intended to use the &lt;code&gt;Retry-After&lt;/code&gt; HTTP Header to determine the amount of time the library waited before retrying, However, after testing with curl, I discovered the NVD doesn&amp;rsquo;t even return a &lt;code&gt;Retry-After&lt;/code&gt; Header when the requests are rate limited!&#xA;This was problematic because this required me to guess how long the client must wait before retrying the request, To address this, the client has been implemented to employ a two-second back off to circumvent users from accidentally spamming the NVD in an intolerable manner.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-newvalue-and-oldvalue-oddities&#34;&gt;&lt;a href=&#34;#the-newvalue-and-oldvalue-oddities&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;The NewValue and OldValue Oddities&#xA;&lt;/h3&gt;&lt;p&gt;For the CVE History API, The NVD returns a Changes object with both NewValue and OldValue fields, Both of these values can be either; a string, an array of strings or a JSON Object, This while being practical for the NVD makes it a nightmare to handle the return type, One Approach may have been to check for all the different changes the NVD could have made and have a go type correspond to the returned type.&lt;/p&gt;&#xA;&lt;p&gt;However, this makes the code complex and therefore twice as hard to maintain and also makes the go-nvd interface seem complex and very challenging for a User using the library.&lt;/p&gt;&#xA;&lt;p&gt;So, to circumvent both these issues, I declare &lt;code&gt;type valueHistory []string&lt;/code&gt;  and implement an &lt;code&gt;UnmarshalJSON&lt;/code&gt; method (Which is automatically called by the json Unmarshal Functions and Decoding Methods), allowing me to store a string, a slice (a slice is a dynamically allocated array) of strings or an object converted to a string, while allowing the user to handle the &lt;code&gt;valueHistory&lt;/code&gt; type like a normal string slice.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-constant-dry-duel&#34;&gt;&lt;a href=&#34;#the-constant-dry-duel&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;The Constant DRY Duel&#xA;&lt;/h3&gt;&lt;p&gt;DRY (Don&amp;rsquo;t Repeat Yourself) is a programming principle, which emphasises that a programmer should try to minimise the amount of code repeated in their library or program. While this is a great concept, It is one that requires one to really put on their engineering cap on, For Example, In the earlier versions of go-nvd (pre-v0.4.0), I repeated a large amount of code for configuring the client and other internal methods which could have easily been shared among the cve and the cvehistory sub-packages, So, In v0.4.0, I refactored this entirely and levereged an embedded Client which held the common configuration for the package, this required me to learn concepts like struct Embedding, Composition and Type scopes in even more detail than I had ever before.&lt;/p&gt;&#xA;&lt;p&gt;While the code still is not perfect, nor completly DRY compliant, it is progressively evolving in a better state as the DRY compliance struggle is a constant one.&lt;/p&gt;&#xA;&lt;h2 id=&#34;my-gains-from-go-nvd&#34;&gt;&lt;a href=&#34;#my-gains-from-go-nvd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;My Gains from go-nvd&#xA;&lt;/h2&gt;&lt;p&gt;Like all projects, this project has taught me and motivated me to learn a lot more, when I began with this project in June of 2026 I did not have a great grasp on Go code compared to what I know now, and I look forward to learn more while I continue to work on this project while starting others.&#xA;I have learned a large deal about Go design &amp;amp; development, REST API Clients, HTTP, JSON handling, Programming Workflows, Open Source Development and Countless other concepts that I will carry on to other projects.&lt;/p&gt;&#xA;&lt;p&gt;While the project has room for improvement, it is significantly better compared to when I had initially started developing and I am pleased with the progress I have made.&lt;/p&gt;&#xA;&lt;p&gt;Thank you for reading this short project breakdown and review, Hope you have a great day ahead!&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>First Blog Post</title>
            <link>https://www.securecommand.uk/articles/first-blog/</link>
            <pubDate>Sat, 22 Aug 2026 23:01:00 +0100</pubDate>
            <guid>https://www.securecommand.uk/articles/first-blog/</guid>
            <description>&lt;p&gt;Hi, Welcome to my site, Please do read my &lt;a class=&#34;link&#34; href=&#34;https://securecommand.uk/about&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;About Me&lt;/a&gt; page, I will post more blogs on this site very very soon, Stay tuned until then and have a great time!&#xA;Stay Safe and Stay happy.&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
